From fc0cfc5211b7f9b87cf79121453ebd0c5d05ea63 Mon Sep 17 00:00:00 2001 From: robvde Date: Wed, 4 Jul 2012 22:45:24 +0400 Subject: [PATCH 01/20] Forget installer/app.config and updater.exe --- .../Sources/WebsitePanel.Installer/App.config | 20 ------------------ .../WebsitePanel.Installer/Updater.exe | Bin 198144 -> 0 bytes 2 files changed, 20 deletions(-) delete mode 100644 WebsitePanel.Installer/Sources/WebsitePanel.Installer/App.config delete mode 100644 WebsitePanel.Installer/Sources/WebsitePanel.Installer/Updater.exe diff --git a/WebsitePanel.Installer/Sources/WebsitePanel.Installer/App.config b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/App.config deleted file mode 100644 index 60bc4b39..00000000 --- a/WebsitePanel.Installer/Sources/WebsitePanel.Installer/App.config +++ /dev/null @@ -1,20 +0,0 @@ - - - -
- - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Updater.exe b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Updater.exe deleted file mode 100644 index 310afe242adc8e9a49f1a5f37820095dcaa6ca8f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 198144 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 !OM3kHYq z3k^*C-*>_nJMfzvxW~Z6e-e)LllRoO-4I*} z?v-%wg8LZUSKv5?Jl!8rT}K|fE{JE>u^z5tom_`UnJZ4hXTHpf>23YlCagE>%eu1d zu7x9yJK!>K_rN^@w`dVyxJAfh5i;Rk-6Ak>5tz3K{N~>2BDD9SW;nFVqMdNZym>!l z;nQO2u{2q_Y}?rOA)Ra^+fKHvY9qV_sJyv( z+x%=^HZAMRTT<_@r&RWHNTko zRnPg=%=y(m#joxue)Z4txA(cuxG-D9!p>Y5rhC!37TLe?%ZKYUY9e%F{^gZYtf?vFflf0m!tw|uq! z9QMw8oWt&Uk5^?rBA<%=>?-Wawwu`QZ@Vnj5>*jZ5T}9AgtCkTZRo9pYldrugI1K~ zuAT4?!X1N~ggX!S4!DQmz657~bIW9TEQ{r^4Cdbq$9#9f9fLa$_b?m@KK~3ds6`2H zfZGT6=WsW{{W9D*+&AD>!aWH0Vz|G9+Y0x)a4&=VAGiSAE8up)eH89GxOc)0!ucH z1uhTwO}N!?m*HLt_xEty;XVR)4(SyH0QVDce+jn% z?$_b&hWih=7~E^&y5ar=?)h-P1eb&RXSgP~pMe{I`&+n8a36v@1NS|+5ZtTby5Rl* zt_AMr;IeT41h)+C&2Wd|J`HyZ+y~*N;ro zeF1J8-0#7a;eG(ufEqL`ih1|LzaM@t{9gEf1^=($Z-l=Q{s-WH0DcL63I4a?e;a-c z{2KVLhyQx`cfh{`{-44BGx#rn{{r~$h5ugoC*Yre|F7`>75)nNE8xEk{@dW+1^+Ji zpNIc>_*>v_f&XFnABH~ze+K^J@E?aCfggeY8u+h)e>?o!;r|i*KZ5@}_|Jp?3-Esd z{wVxW_+NwnHTX&RN%(Jp{}%X1;2(kiS@@rYe;fSU;Qto<--3S%{wet1h5udni{USZ z|0eivg5Lwb2mW8c{|oppg#SYLzY70X;TPZ+;6DccG59I?Dfn-P|91Fk_-XiGg#ShO zJK*nt|NHQNAO6eXza0LP@SlWFgLo%gGu$z_C2$Af*27K0Md9|swZe_THNy47wZol; ztAg7NcLUro+)}tcxSQdo;DX5Em2jPKAA`Fd?p<(0a9@F=0lP$`IE1`I$S;IELeP03 z=$;VtO9(n71U(UgE(oE&htQ`(=(i#C%@F!u2z@Ms+Jw+oLh^4J{?@^*f(ybmz}3L5 zfQ!H-;p8mEC;#*@zH1}<7UR8VN>ka1b%(O0!gO&cTk@ep+01aZcvJI4X{b;f&kf$x zd}p>;$`$h4ZeF*Z|88pToF1Q=E@rpov(r<>%=k^s2d4+eb3=Dz&-4{eWb@kwZ@VpX z%g`;iZrHT(=Ir|RP1nyaY&t)co5#Cs6ty>VGJCLC7%gT?C6DssKXjdjfDBFf&mF^+xTCqru41upB}#fGv&GC5_`Tp+gZ#GqprEkcnO^AIz0*5%}tG;@jySKOJ47h^xp2>UG#hR z_8d9Tb7+6ZKKr!4`#|^p?xS71{eX`C*#QT7Iy(Eh@9gN491eB$_Vpa{Guz#@r{nOx zK2It^QoSLc`QB)8k~}ZrZ9nDau1wJz9~=k&&_zq$;8eadlOM{CdsAaY@YyS6izjnK zSyC?Dcz-7E!={&dCo|*I*>u`FfEM-+o;aJEJd(|v@E{XtfsSlxLtA_0q3xDiy~Fv^ z^yFlrNGU*rK|IsFQyKTMV+0a}sIL4}@r=c(v=c?ZO=X{VWk(>UeA0wAT(X-VJU_#Z z;?P*`WOmn?sceb(9wg5#$UJH}M~bz}dd+#H1*@&rB>7 zZK`s$SQdvy?#+&mnC^i-U`iHpE7ddctfH1{0<>06tQ32tNH_dQVS0SH=VZ2cirn#> zEGk8lLsQwj8#$}=j`49f&MjM_*s0T6AupYUh~%=RzQR;y+)EFs^rpw5f=W|bjr7QP z<|J5<&S>i%0B61QAltaFn8}w$vPE=QFFnO9gg1Q!8{y~A)&hcKTXw2(l zx#^;~(d=m*MZEO>%oKV^ew13IcQQNVr8}m;|G{Z6)9Wnck5A`8W+4wMM!=LqxzRCr zos@+lgL8uuH*dVno1PkJNA7uWv}BsX3WYX|bUw84I8sAboy-kqhYz0g(xcftwYEOM z9sph0{OHtJcYaq6iWT$?b?0+by}7fZ-0#c|O|k8J@i#k+XfJ&tdq!H>JD4ezP8Ev7 zus?Dmxgo(FxvRT?2hxy{KoVn3+H(6NO>0Jzszx_R=G{JcM$*Fm%F8AIP4b>W7A# zIFcJ5-<93ND4?@WnQW;uH#vr3H+`BIQ2MZd@M!#=X)qGf2v)g*-fw09U^Y*UD!Oae z^az4MkA`(JCop8_M0U8Za40)bILRS>e|9*R@u1;vy}2tt+%wY2u8|qvohu5*&m79a zyc_P#jpj47<*tIcuK?B;iWSra^Q%O2T<5qjKV)}iDziIV8Yo(U3qD1Z+BMx^pI%?W7h76xx4F( zm+oeJpvBmA*lEzxPyus;MyNBOp!S)zLX#IWdve+FVH+}3n3w>s?c>?pWT(iQ3V{Lr z!FPXlYOH{6wl7nf+FuxkoKtD-7gd73E4{o^z5LWjiQT@`QN-W@dC5-XrViLZeLS4c zofaG~-B-*_+*uf(p2+Sg7AE#gkB^`E31}cG;b3NJ4E2N2IFvn5;DAKajS3*m))pS9 z8YVXgb?5Ckm^OSnkcAZmTG6qk{!k;8d~CH4L}q}yC13Ick)hhl{bX54BO2RzX5o|> z4L_U*YlTpY$(o9NjP5*C>A_TJY9cT z5rrYQ?)>ER)ZtRLguZp_&0gBE>Cj^eQ21jL-Kbx$RGFkm?+~(R9#)=h5oUCzM$b%G zUM=+0Q_PK0^;PPrd_9sWy(q`2fQ%MiI#;Mz>0%a;-)vuqtf3l0QiP_GRJwhF=!rUJRr zlo>s@pGc>7L8;0ky0^C#G|7CWLq^c~@znYp7yC}ZBJas}=V8~dofp8&qAC!yQXT0<&S_}4JI9Hl1l-P1?D;Rnh z8O44B;TTOvp;#eokcWyiusd{&vt7;z!;u6l5twgeif33!RXmuy!Un~J)OOmjOlem( zD?JsZ(K09Up2E24J(*$URd=ap8p@j^IHVN)dI2dzjX5n{Am&BWr72@eQo)HF&K){2 zQWu7F5Zv7hInEpLq4As6(OG-xS?znskIG}@v>oDmMkpsruD6w{xfh1QQn7SD$c2B)(oZlav1K&ZCIFwb;e>cG2>Zn>^zL2B27%M zm+Kv5uLoN!R~iG^u_&mR_8DMb*MZyn_S%Q; zzOF+Z`+B{u1C~q(04bMmm%r3g z1dJ&sy)jB#E?-KIdC(+d8Y7UT7DzJC*s&buM}z3+C(uCQx|1P&knhLL}w5+K|?&!B8Q6Qx=4bJqAHnEjoNApB~51oAn3{ z3p6;M7JocF45Qi`Ru7@_2wx@_tofw;A=wH{WKMg-G9Hen2d788@!S-Bks@I*0+1i0 z3X@Zkjt!O@5>ToHO)r?)!k`2W<^&xc28`S==U^K)-LhV6ye{-yE+(aqVBj+mYE~E% zaFD}}8Wyt+VKOUQB$kQ;=3C$^HHY+3v8iOd$dwB1?YC?iM$>M9fFBs}`UVbmc@X1X z)4#mFj$QlEAKA0K-SSsuem8p6ZqDm>L11$-YG+lJ1~Ef|nv)6NI48_gqNpHYFdCq; z@>r1@^ri;UVqm%O!-F)P;GaQnYa#RyL3H{e&#|D)Q_y?+ybmgJr*q|PkJz!LFG#>Ua zOiy7Uk^N*?{;Dj=Uz1K{O8%OV{at-~dv<%!Qn!Pk&c2)F??(CCCVw#?AbdU421eUn zuXAr#=N&hzw^6+|^)`5?G9`49;t3k37}AGfd#QxDf^bS`lWwQjP;)(Z;7>2wt7Ctf zbw8Ru&;@NNdiH3#>(HSCJr2U5Ls*r8ZtdvnV4OTqb6Xf=kq_V5b*Q(y=YV-0$(_zZ zKnGU&OS1%YW-dFRXsi+F1AC1L@B|i0s2@Zo(8(2#T~~F2 z=od5>%r~qKK`ta(BILUlYZMciyqE$O z55|L4b)x>MO@vURT2uh7o>78r)T}3~;Y_6DVK_$tHz1hf!EV8d4H=<)L&xdu@(!?F zWrBpElS?UFxarP&{&t9HB?MG#6+Gy?!%4w4o7qViQc1%nV`6*5q&4fI9qFYzApS+n zP%Udz@2g?Ii*@kzekE)_bav&*8e&HZMNUzaELxpcjM$&cdq?+m@A8b@;oW|;`=FOT z3nLjE%uHbQ0hGzes-SHwj7u6YPRkMYzgr|$2Ze`f@B-do^P_3!rEiA~TrukTggWbz z03Xak$0)#x9#B=EFHFEv%W)p--Ef1B{_9WQx*osVZdtowZrISqd0`uG9$ql4ZBANj zQqIS_W&MI-^U?xu%6cH3zWNI?fh~#EKu%-1elUT>GaSv z*7>nkv~~N2G>tBFl&#xuPN%2FawTtTcKa>q^hSi-mc|S;GkLRjd!b+#-OxAoWzL@Q z4q)cJPpv8hVd|KJNhOP_m??3OL1!9fwo5Ytz5g(V&5>LlTI)!55HsKG!Aw3ozRv8E zuET-_b|R-RwOxlvi7c0t*1MY#e1)B8-L3A)FPx|{ zb@xjKqEG0o-D@W&AK}XBMU$Dl2+v8)pal}^wyffIm;6OkUB!W1^_q=ZU7Nx9i6s#O zV`lJQr%&a42kwo?@h!_NrDtN_8#?MW$CL59jAS|8`2jHo;@&a8^d z9E7p%GvmdS=ySF)i8L>em=(jp+1@1ff)TnQ>&f1$s$S?X=4;kmDjia{XQj?k8D*2M zan0J+RlaoT(wJQe)e>x=gR%sI)!2qe3O-36lrOFEp+C{AGFd={e*mZ|-xJ*S3y zG0z^8(8`uhM}D~XRAy45n7^>4uRsClC>Aqkyu;YR)llyK7^`(&07t;eHXWa^3&yPo zbZm@oBBxv-bC5cQk7J3HJ1^TV1$L_||*Fh=*H95yxTRhSE|Bs zp9dS1R7vcKEg+2#70!xVxHp?UVPQquBdbo731d_c^w+g1HU5Jn?zKyoeubn+HVEp( zT@+?uD?5DfPI;D1bw+R#lXzzToaZ4Ffg{jJWrGH5w6eV=a(U3~nZxonOw`>+ZAxZ~ zTq_UUk3T6?L87p+mm4|5J$R$#!E0G4W%b$Z<^+>l3|939`R&dh9H%+QVjwlxADf;U z%i^S!>FOL8Fgg{AhM$F^&+z@3(cBQ};w+Jyq;}?H>S-T2PMMu_)pWAc%L4rlU+TtQ zIZAX!PZ)0Kb7qTKs_Q>=mvGYJPA*v;owW-sm6){{#Ri@gz)~v{FG+xjl5DVwoC{S$ z94@glPr+w^4D9Ik5&#Jit;+{$31>T(xLh}rsP4SZ{7M{MGgC*vRHHUY)YCwllN+~= zo+_&aahQ)#B>QZ9s<2(;&v|4l3YojZOo|r>Cbn-j`NOF{1~6Kt?55{17x#Hi{G7c; z#`cQAE^RP-2b+;JQy{2P1q(BL_TD2ybQ$0dkQ14&3;Aeh+J z7I5}T1%07#;)6}jwyB`b2_hD@Wyhy+o}e3R4P4+ILTk`Q5%RCJvnrWgF_PJG!I?IR zX%I~?CyaP#Pslr$*xWrW@@nB2rhzs*nY+?C04BXE0&~DlvU^s5QeQb|p)&y3x5X13 z&fy8BGdteW2Xynh7jvKC$$f<};g=3iIP)W?O)3j3I)1QEVF=FngB7#1Nfg;ybk^q( z>yIp${m4KGTiu?Sae|~?dXUd_RbQ&W4?QB>lb>aHV%FfEA;jYxSwe`67%~`9ed8>P zPIr6?ObQ&U#rpc39eK7A-#R}sVIwdhT!VxFazh(5mc;oak8{{BU zy-(Y-KsH{riHt}>w5kzOX&Qpyg6A3k}mT z%E>2ey$LxtFG_|x*=7xPuJYNF8^uXGM8lA=JSFEt%Ac>qlz?2Ebgh;$#_hzx&mYb4HhM5U-eZw)re_)JnS_!}qM<8_{ zf@$Uj5)*dQAT4-Fm09qlkfdEWim5P~ic*+k!7dO?Y^*OVcuYwvwQwBM*~z3i97Oav zLB!gZ8|0BAV+>--J%!ni$ca63L@X*`BP=qDz=&g4%6OP8hm9kwRr4$`u|-%}o&XGy z3@Pg5w+_GzVt-(??sZi9$r(Oztc0es3@nG;6}F2!`b4?Vg1P{~qk9YkwgGsw*9YaA4iHGBWLqRNdHuMk7w)6>aL7@39Of-jTO*|-?d zSC~6gdOF>gm1rKj>KOsD(b{OFEO_G_7Z(%7%{t9vo)S72bx)xH!X(P%h`P({O1RJC z%kpLe2hI~z)Oui4$_zVg$P!cWHg%knyo&ZP^zcp3&b zPJc_ic9?5yi6V0$g;Gj7J?nkW`|K$?2s`#M(bn4EJ3C{=LX+S zV+0H6Q0y?^%o~-Rg>kbwSz6a^qG5ron~jX81KCrI_O`Nbu_XVfWoi3hI=x=FUs-9U zAgO+${Q|bKV(R&c!Rg#M4}|Db3EM4cpvY4R<0>AZm$M$~DDT7wP#VML1R?Bk6sPw0 z?oveBkP68G7bHYhc=ZA&UyEtH)r13+lHrh(qWzEeUz&^*&4a5!A0C*J^^!m8}_ zBu*Ypo&k--l_-VN1)jl#8Ok$y^4=c{D#<%G2Acs+3ckrQKCT9~O(#avW0u z933%7-q?;;IM5|S)xu}J(8Rn8qSv&xe%Jvfr# z!#rw1aiax}Zcek$KANTP%Cd@yuLKwjW~LHMOW7FVW_IH3VN3Hk>A^w{%S4nV{Lv$j z862%*Vx5C6aH@$FxMHNqMNW(1ECoc)KZ8c`D(T@y928?yqR|+HBR-i4yxKcER8A@( zEH}kNA<(iJ9N`nm8_njK%{Z36Rj5U98OmrJV$0!}{7Jm!o%IeM>XoC9I+8$;vFXAA zT6YyNieS}UVS9#!Rkv`ZkJ)OWxh+WcS-65|+uR?{=0_n9izOzQeW38Dh#P5AdFI9_ zB>)W2BaEaleacz&k>)xpe`goD%ni9+7KPDIe0g1Cx;M{*uTz$-vcf#l}5 zb^8QgL4j>Ke&!Z$A5Nk|d!UmHVrN!5O9sR8=^>rR>A(aD=ZlaX^4d7_(s95TvGVG+ zlps5$<3@+Wl*jRG@W$(!n4CI;^P_1Q?J?IBh99JYWU{?j=d%TShcdYmi`Pxv?vcv5 z^4n$MUf)@hDa)*lY_E5^#P;5oIa7eF3OU#zFBZmSx+(h8-)Uq&l-+#-I0=G%0-TpL z4>;~UDRA#p)&gfRmzQX^D*;sQ&Rhv=cD+-G#fCK$lWy7*Q z-lf1&gQWJueYJ)(FgJXfV8T!Ak~4pjza+vr794y(o847VQgMuH)-yNLyYqcG`aFpJ zFcvRnr@y#I(wMK^lV=;^^)=-e(Pdo>7~L5DMl<7`#X`yKwBwB`u#q^sF_;!cwfQ9g z9bg*DLgw+X(hlH^eNRyvT=K*jKvWE=G(FVl=`*w+tnDT(NlbevK!r-Rq{qHT!RgN9 z)gN>%sseB?XJe7PCT&9-raye=3|I3;l?J1N_M z(!Y8}NP(RILsry8>nj|_2^MqO17k{w+k)8IBC@lG)Q6WCy48?^_~du1cN>oi{ML6YncX7hKzNJ1K{?{IX(>(|_cGvr81*(DsaJcXU* zQHY4#Eg)xCfhz|;Bn{sJ1JH^6@4|#bLYg3J&?WFd>d0lBDS zcjgR?!7=W4pk0MVFdBk~8JO5cWHKfZSa(3~WC4_mpfL}m7NOb?DbnTtfh;ruqp-+V z00Ri3pK#%h;9hKm$&pty#^HPs23-**7}R&~cowSf_UzQ0ZFGdlGAIXC4slu~_BgSm zef7otYG^9$i)!&=69fu~33WTeEF?o^%EZCnIhKJ*rw4wRK2rKY`CgoXQ0fU(Yy`DM zSS<)K*$HB~@FwRadS}U!^Z*`2qSZN9{1G(2>zKey`mijWnu6*>;;G+H6^YFLvI-$#8?fBQ0B2& zYiA$^dK=^3um=r0#&>-9&LQxyI9}ptF?Iwr>cs#bOf&D*$=Ev5!M+X~9L zpdlh84`;kV9vZQi2u%5J-g$#^5sOX1wUc4{(51(-7%=CcmSo1hz#}yB8eU}x!%U>0 z?1QC5YV$nDV_J6v!tsCD`x5Y~s;ljN&P{S}E+Hf#A=6EA83JKWNPq-Efg}tCBuW^f z3<)Galt~B(iuDE*hhht25$l94ZLzhjR{fqNSGBk@kPzwf8ya z-Vl%u-}8U}^Za7gJ?|dZUVH7e*WPEJb40$3pxxx7`OVNNm@^GmoP5R#kF1zC6`1aD zk8{vgL&#nNj&)BmP1xqphxKII#$<$Uhivp|Gc3B7;vP%`mO5lfoqVzr5Wkj%>#E+^aU25kV$iwrIU)9z~==7D?K z@&+}%$j$>nErN7{;>`6Scx~%Jq^O4FZQ5{4xyeo85F#6 zBgtB5zjgrB5>X+>abZbqn7rI8y%`qAREfSf&s#_k#&x6icHDVLo&(b=D)&r{s+qO? zMLc7sUmJh{yF|@jy1eZUo|?C29^HF=DnuSLC~3=*(GD}L%%X^FGlDN^f?_RSMa3M~ zjD0!W^oM!8+t!hlf+r{hhYdiTtGdiY|z4Rf(tq_;*I%?^oySQ&C@ zfcF~8jD!{O5~u>6x0@#qm~y&VI$!U^AtfwLqdXi5`I=2L7B`R22jYQM*p;Q1;_MKf zP-JFQnua0>qmCUuHImt$y**1mi zS=9ie;?NXxnzH21(_PZUmeUS?uW6T%wkBS1(lPB_Ple(>E1F=qw6{c988 z#3P43BZ$pxtnfUGhmo?vtiO=Pc`p(#Cp$iXd!N)%Q^(X(0(?bO^hv%`9@#tPi9Fsd zh+>mt7o9^36n*Lr)5@vO)wMY?XHLTD*}uI5Z)BXlfUEsZQnPJqhPRoT+CBdj6&S_5 z=@s{oM&?vZW!vyh zvf(gqD;G7LjqMAV9^P%7Vx9_X_rXIGDXV7pIb&+h(%3h(N@wV;##6mZmAT~9hNK;} z9PgXO;+y>*`^;b4qE3+_x&Yek*y5vDVg8d7NOnd|ZE3~^al4I2k&9uOp!j@FTKjd& zX~o-3jtvCuyPTplLTMbV7BmrQ5da|ci*PHSpx=}Q_RGrc)kNNjCuv7$XUP6QZ_TGMGedGB9A5d zAP2m`w!RJu5_NKR4-_+ck6h8VddQpDy)f3ny(ce3R8+PfP#=#-P(kpBVgtNMUSgR7 ztr3F=-^^G;+$V=vN8zQ8`h9*LmUj!9R7isMVyNRaR-8OdV*MjtFaz7<5Q{8REf-bB zl|VWP_q-N_3@MweAAyA4IOj`@v@6fA#HcZfjCXj`K0;094VQTFqF(unITan%+qmpX z=N7zK7s9jVZD;4vOao2+vEad6n%lZk&I*_}$;BDb1x^u&tL43PA?yvTq3I=|AieO3 z3ezG2`<}{q{Q?&i3^&h{g5>_Qx&TRK8a7w1=n-xhWfFa9TF8LW*j6#|!)ul|uL2`H z(b>c^OR{TJg_E|hRA*m4x~i&lQ1RfZ{zHq)%lns&9$M1Be8`|N{RdZ;4k;N_IdsgR zszF!i`w%iR)Nq(tb1Vm|!Lu9Z%<*3Oz;`Ec-<7Ww($!0Y=g6_g=6SNl;zl>Sh+03Q zWDwpWs9Sw<J0M7>Sr-N>h>swV60Ykl*b!=cU0 zE%)Qw33nYC;~`L+7O^&(f+a1uGrJ2x+a9qP}=6Hc- zRn2`V)0hF{Cwq^Wdsi6cOXVqaGpuN2H`F@Q5VYy@}48gOR@{tHf^FXO## zXKLdc&?h#`MN3AnY-zy+phc~s4uf$J@s_{y>m7>2Z9#0HI+a!}Z@`|*0#gu2y$e6O?Ti4SvB4b1fuupZB;lAO-L~! zHj@uGu(4H*TMP4W`v~I0@nk%byCiCs27g$$p>)r{)R#EbdNNpn!+?-1jtfO4Y$uuY zPjoxQCyBX_UcF>hGad(#vz+Kz%5svvrNJIEjC-z_*=>n#)mVJZ05|mYyPuWbU~%q@ zyZPsvBaNo3+dS|OcMNYM(7X9;IY#AjIqN4u(UsxOcnkakj$|)^F}2{G{fliu1^|ub z(JLsR;X?M`DR(IlqL5b?coUI(6F|Q~G%6R4<}ARQq;Y@WncH*+dhQ4wQi4*W$LC#) z4)e~x)ekZ^!M$oQGO$h%7Ya$~rSZ0OOrWXS3tKTjTM#||C*m~_$U1dN1D?gjt%%F; zc1O845LL-!?^<>rq|H%xv|ZNG-P|ZNGU0RP?uNX6C|kD3+y}h%?RRv+lx27ux+6ra z*RW>fop!HU=W&!8p19I)A~x-EVg`6oEBH{{iiPrmNBt2K)6rsCmo9TGH>@7q_U1=k&hftt090KOn0*b<1Ev_;hW7m@C zgpOSSiZQ4t!)+jR8@jU;9<6ph^^YmuGhoi98Kxh7UPiV{##Z9qGCU!8=v7PcshK7y z0H+{s3z+HBoCl7QR@64Ou8gAxl9qdCVtLG+DXasVXp}uIZzCkLkwL`95U+1%(Q(?S<>#r=}ia<#&X_ljAz28ZkydIw@$v9K!)TPNq^@Z?z< zXnez>Q>LorfzXpPw>#`Tj_9qfgsYCSPtJ>puMtP=PmaJiXl&x!|GX#&0SBFUs>usO z-MEq2w7il_0qBYsg9+4(>e0B5fu8W9OlKj5>#|{U1Eru498bsIqVv`dNBJ38wRG_S z-49TSs;0Rs7vTN?kN%lw;Ji%LICryj`DlDOVg(0=7cpb;qH4WJ@WKo;h-y3Qz~8J| zI!|U1y>%Fs32~-b*za(-jBe0?s9q7*Rqhqzbw6O4hZLQbxb5}|ciM(i;M`1!6-ecx zh85V6M>+HH-Ucrd7Do%B6w=&a(Z=6P#aGqpSMs*4T&N{$7f0nvUVW@WrXTrb7p%CgP|=Pl>l!I&q{S$eYSR>H`(Tm!a^L#MXtl>4y^p_?F;6{KN4W zyr8lHzYB4-0x<(|7Zi8;aor4rPXr-$34XB}G9d$Tg>MYu)t1f3i<{=iGahM}nI_Z0Ov$kB%_r zr=T=TtAwRyp;Vax_>5nTbQNo2Zin>-;VFzy2a>ymD1ifuLn(}*wi5NSX54=VX4mUl zSocVDSM*?IC+fjEKz`BjQ%|qWVwrxUnS1O=TryaPx)qJFc8fI=CA5ogimG87CZ|d z*<35>7^_2PnwUPSx0GXYWwe(<#Y>6tQWLJv!N=5NOHsZa2wQ^okgqU4B8pb}@G(D2 z`NrXD3jWT=-zfZzSE@JVO$lgILOsPBxq%jdzc4;Uc{x5$c?CJ^Km)o6{esqJGBu7W zqV;nT!r?$|RGBoYOYlKi8ck}xk-86`=uKRLP?~GyLursu5&q4D#w@QyTBG;16+D$(hGmFgH5M^@xe zOHF08*FKfeo@Q9S2};FJfI(NjNw}IMS7UKCR<3#}E1sI7a>syE@! zy%(lsRw>fe=Ditwc{YP4kfU-g@~~xL$X<*tv;xM+uk}uyGaDsSPpDtL!GWWNj=uGk z7@e9qnTk33;ukuUNZI$mM`abth5q;lA`ZW9xdV}Iu3PRvDPaIUUfUO`bRC*9T~xV# ztp}=^x`I2WNsR#+awh4#THY z%SCgoDQl3@(c>`21yPB_u|%Rl1}zj+YLHG@X3z?W8!Sjo=LAm9ok@70@Sw+>w$qD+ zS8YARh~=aeHdCB8rL-Ak8Jv<^@QGyh=mluiGPK@G900^=O!d}oz{&D*v^i{As#ct7 z%6{OAQsr!f<6}mf!jK^)S>j5Pspcactz{VD#h~mjZ3k!pRLAkq`APU7Z7Dv+t2#`D ztsVpZ%axTq*U0OniGLvNIVCd*PFf{?8^MRRCr&H1Bso`M!adKKqZYwNlczA`66;J* z+Dj3x-HkBHt;VRMD?qEX9QnK%0VQ_27%`k-j7xW+!x3dlo4}bdS|6R+n=y{Yk{548 zQYN%mDeXuH}h+QgPHC(~<5L#nQXqVrO(Xmi<8ww3NK z`GI|%&>sJq=Y>e=aPLUhKjsYAikLrJvyV4oO(Q^bf zkPf8dgjU7m(spJTc*P^IkQH?oj|748d?T$3wa&56+OjRd7;t940m{l~FQOgMRa3Hkln%JR<_{+~k8r9&l?SN+2IGij4*Ie~2`PVwAvzL#9kR5x5-E%62 zYX4vBp2!wXuzCVwqiE39U@90U4mzhke69pxUR)8TdCK1DH)_WM6wF`!{t;{xiM6JVVHdmlbBq=ZUz;HrxjoiWkX^?cbY@gX{k89K z7FgE9gekRnI0MkGQT=qIyfWI(6;vx)L~c8@^$|EwINLR2Zs1BzHP?aVl}P6`)3M&# z_w!Vq%C0Rq=LGUa-+nRjp1gW&+r6l14wvC8P?xs~)XQjRZeV#_|2Y1Zo~gKIp`> zY4cGgCpSG!dBWwAQ%&*2OY7vhqmFQ?-gbJKI|zv7vW4h0c=(I{g*fV8>9! zHpZzSTDJcK&7S29r)UlKG}hBKdI%@aWLp27xt9aV+iJlqm)%yo20EVUnv>V%dJWTr zEgfgp)g7$IRkZgW?T0w##4{1S!Ka=Aowz}+|B6*)9!uAL72C-vjgy|_= zd97#v(XVpMp<{doz^81G5vn~uJ-)OW>l{v7^d1AYZ&4f7k#(Xj@oKbJ)K*rGcjryS z^fZW&@ACf%9$7Y3pM68AJG(^DI*7Up^>paP)BmEIpx0MsQ?OUtRBcx$Cf$g(>7q4J zm*`mCXj^7-UtS4`R>t&U^yKf=N&R*DBDO|tHn`WO_dxI%3d++1TWdY-9yNp(k(#5e zoT{#doV2CWq0V~Ao7(!Jq){*%oc^?~wOvuEyjWux%bObOSO>2qj!c-+nLRiYQKzW) z+Ue3;xZIxPKUH_;AyDfWqg0Gn*CL>?o)nh$sp|Y;p<@%(jTkWAzYQlgp?qSm0P1GU1wgyXI0fnd;{_OH_*mGNg1kXJkj| z+H*U!Lv`||2szP?n2Ox|@35@*2K1Vf?gUq{?J*GBC}(DFuNit*iTh4^HwkyY+LP6p zR@_$AovNb^vZo+=3S`AJJI;pI$*Zhr@ z76#*>Y0fP7-(M6scGjEo)pYu-v@fytm_0`eLyy7Pr{n&@>6aUx{Z<#Ur4$gmg4&@i zF3Z&`ecD^LlqH^N$+SFIV4PiZ`ogE9GJG-(bQzd%Hn5zkyp^}(=4iH^t;*9kQH#!D z7BjNf^tjE{%e|G&WC z;I?B+Z!>z!GUuiQdDE5@E^6fV(<{cAs(>T;3!uR@V)^OoI>TS@KhtO62>DmkMcA7p zLxHNG?-x5vd5g?5skTVeuC1NZ^TrgE&D(Tz=>HY=ZlU!4TkKUr^P`ue|BG1TQi6M1 zboe+h!)h|joU?iVuS)GZryfd9*M6DFarBK!&uhnYt%9%h-_gAL|9ebU%RtZ*gznT@ z$dTrVa~-!!Xm$S^!{xsy*>mM?$`mlhPS?!-SD3um@#49=uAMcfH;MG{)3cs-`%brB z(tf?ZH=|3@JMwy!q#_?j>uDHnu=WFKNxV(0%Mi*Qh}{U&jpYq}_8DC_E~v(|`8NRJ z9JqSI){AYuy}(=6j>TfbIBKS%96Ves_0c_^F5!663w86vk+yI83=7>09#!BnS?@tP zrRe-)ke-V$y`85uiOz#;;Z3PEHL}e1H|Vq%?c6BvY-zOUdzqP{7Z!F_i^I9RM! z?B=&;Dz)Q4=c0Wp?-&*OtU7J<_Rh)u?Z}%d#RV`oX}E%j-g*09+55P`&#kTY&New) zC-eenabgdwc4ewHRkSZ?zg%tD#IQp6AovjbF+`JKbHe#Ab_Gh8~mJV=@~N?(Jn-j0K_)t{`cAv`yd@ z-FMaGjK}sz7j4g}H!$=F|1x{UTYb(7S+7+Mw}qo(TB4=H4JJL=>K3Yw(d||7JXE3Z z9d^ec|0mLfmSo1-EO&FZe>EiN98+5go+uwj=Fa$YdR7f}+UM9VeKdupBYIV-^+P+I zG)bz-+rn&r$DK9lGPUuFHb$O>)NQDi9@SG*v?Z`QJEdGGEoi~v6t$8Pq*09S_chRR z-d@3Ll@P9PUhp0Qo#T^_BY0YQrh1@O{HwKI3jN~@=NNTPrQD(*N9>I+*FDvNa~aQd zc2#O>>=uc0UxV_YETUKV&UDef#AD=}S`?EL7HVuzc4hiu$`~ZuAbKx?n1^wQO0h%1 zbt=6%;xb?-*0F_F;<@0PE{;l_gf>vusdMZRmFTPuREP7CigWr>Y=qU|nrA{K%><6O zFXv(yd&r1mFXjN@#*M{{y{D&`oAb_7m$bB9~xS|7Na_r@4CkRj1GcT{I@ z^te6MOSi>{z{Z!qIN`NJy;iww0mdz&P!(I%``L zEqT@7Dc7-c9_P`e8|!_V)XrRUAuNqa9eI>$5o>ItZ=?VFJ7nBbUK(}B%<+umMTNnt#wQfQ5ciR z`;K*{o$xj__11B$s#1|TGY`SdoxzyR2IE>=Nd0sNhnBv<`@eD}GUsGd4x-HUhF9Amq9R|Tn6>TkrlPj}OX2GN^&BnTUv$RW7Ru#*>~jv$ z<#CBYt#BMxr&ciPp8s|yFn5YR)s*^gPSKI49PMhmpTR-lt;=-7IazpHwr65^{^#`! z;_{ov8_tVfm2kkfJ-8lL-X2A?@z!0ZV|n322tsRG_0 zbk=ix+)1w*Xb!k;Z(tq;l_LHe0H@2FL5y}D=H z?tbVMBlM`D3VbZV=w*LuP3JBi4@hbKaYnG?3$MUV(>X}1cUrYMo{Jm{WHfMP5nVs` zOvV~_IfnbL59|4(H>Ljy{0TJxP6pDmsPZ8_@c(Os3%uA1&t^^d}!xb4HMvllawLlGRn`e>aq2^FVeBRdMRnP4lJF0Knd?$0~j5F2Mna`uG9=X>} zGc=;_c(h4dZ^ zIcBx{&Icl*cT;&llQB3>gOnS zY|n&-&-qYk5^L^_gk_pi7TdNF4D%}I zE(J}u_xzWWn@sY&VS8o7PDU&P40S&jtm*V#`F!$Ny8}(C>%Y(R$rb+VOrP9vkLlR* z+b~_xe#6)g+%SmN1lrH2=E}xFbiaDSphw2X9JNQHg*`yLMQ08gVf?jzNEw^15`w0^ zZGji0??1rr%4kn#)X-S1o-Wo&+mz@|KOcN}TQrbMJULSFjR;qro$l0Ja#g76oRV}{ z^tfW4Q(1rQgE)$M^07SB+@Rl?z}c6jP>ns0iBkJA?=V_!Txe2u^b55`#&ORzj!oCc zj7zbf?QCMvL*W`t_akQ#+HT!f`rx!a@~iJ|d0Q;>N88rr9UIh-tD=uCc4~HJ*?+HI zKDK@88X1earpESZbPxRpy)%~geA~8^XGbSv$K5;h>u7~1&*-@ryaymPK7_tGk2VgD9eYlH#9FS{ zafDoW+}#=7s$=wBb5)@|@RLU)+cM9!1>8Wyr|V$6ITGkosiDzU${WRAK5n4K=Hp6U zskoq(mPC?H5(;FbMSf|eMfTyMwa`j!t3Rhdo8@dB|`O<{TYtGss)i(*Ul zC@n6ns4l4(-GAtq^2+{YC1vybk18u3+P}K2vV2t8kU?cbMvqo1U@7Vr-b!VuB7SmF z-X|D-^6v1U;*vq(cFV`imSib^$$&xlhxfq*Efp^Sce*W=j`z~x+fDc=;gY6BVe?}C z)5XM73r>?$$7`BssknJ~JD*aMEGSfMavb0PnBMk#34D2TZE_;xR^Xd#P2q)jvGK5h z125IA;bo&uiv}!dY8i+Z-mSvdgI4sgROfcy6W9U$H2{JvsbD*0dO4$%9-C*B{C~D! zbTPGDsWalmP5tk*AtV}`9H_!;s`=8nq`7#9@{lsTyAa>0YJJU8L%*ye2I76_?R?83 z4qctXFXP~wJZIjkwaKY?*)Tqbu|j{4?Tl2Rc4}lpJE{={SJqM1iZKnqBz2m}9>>D5dr+7+^t%mH4v~c6XyfxPO%Eo}&rTD`30KBtt>5>JD z)=(GRFU*-2Df>CL@Xw4Z83V2REY<%^RD`d5lrNL~f5kZ63+eywDn{$CEYX@jH6X;bVO z@>6L{>lr4mKI4W~oz&2Nmg-f5FJ!K03a`Z9GV|fju=xy8%va*HR1zSgvkilOcqnI& zP>Ny0af|_QxPkZ~?22ERA^sDBiR!E6{{XF7oZ(ekWb@K64H# zELC=LMMf4y?Z`xbl?OGn&!Ur4zXG}6=?a)=sj;W5dU|uqLg(vFr)Hy{t_IvpvDCR| zR@j$u=9M|xQX@_-6JIEjPAFO--&*Jwc7BaxF@7?A34D&YH`w|w6j2VJv6*riBfwnwKsI zZ!`u`WtlzFYBEKhj-vWGEOlUzq~gPj0Y{YaI_B=3>zCOO2!`~7DB*!ERWRE;P zArGAT!pg#5a$MN5l5t`4!j1O|zq3#Ap>A)O-2q{u=FRFxO6gTp2` zj9@Sqj8ot;L7|d7Y~!;QUfaCP!lj)Bc35HLZg6QOC#Nko_yBlHMrsA67W#eyih^>- zBP(|iiC7>-Y?#;<18POC9=1+mjFI2dG9ts7O#`q8350EwAu2BU&OW}A`R zA)MgEB{SblMp7QQk}@SA7z`q=o^fe~U?{DS!c0ypOvF!GEAE6qx@a}Iwd^3TF>Dcu zpFI4p1M;L@8+E%jLRuKhkb;E~fg3$w)5aC<^(5OJO(5%w97>i5x$Q%Qj9}!1U)kuD z50V4QC%^2nWFQ-=1p9#I;Q|!>ia<~u7)Yx_>p&A&9~_r%<=+AYCLZ3uI0aKR z(%XmFt`rz9gyX7h)KoWWs)<4NF_9559nNSiF8_%4~bc-gSv~&;M9d-2AWnU5=*NK z!Y)&C&|S>05M+S!0)A~MFNw#msbJb~nZPM*3}`d{C+m+|;KYNn||_hE?1 z&<+IRF{T5FGTEYLJ%(hgf&pQKMwh{P37Es;Z2Sb^)=_up0N7R_FM(zOC86JGS(!8s zW0Wbtvjty?J`-3AV1^06PoiH1L#(d?9Wji}C0w=SFbuaO3Bas}nFGmjMT6kO4`ce0*NpRVE}M#YqPCG;mN=h9@8W27(^f@nn_#BLt-uRf}B;+Ecsug(~8Q& zXrKv$cZSqDrW~!txM?l#67IlgriuQ?1~?e0(!+^uk{~bzvy-F&$zxe@3iXpkIDVKQ zDQt*UL7s3IFhyZLqmWK;&SDebf6+^Tpvgc0M;3w-g%Z$e${Ni^ZgePTM|f-^Ms%qB z1~8Nv9I!i~6p@(-xr)L9I|)jLDwGq_!mO$1<2sqF8Gw0*J(yMv!NMQ%ODDr;LSbYF zjxlGv)|spV!yuLal2R;RzDmhg{0BbrLdkjPGN?AZz(jHRLNW^IAz+3`U3VQV2OUHV zm9+C{!Yzc}AQlk6sp~e2T3@Z@*2xF+a#l$*BhM{M4Gsq0|lZ94=Rq2E79UH7oG=P%OGw8&r3Y%8q+)u**4CZpHk zBgjPQ_zE&(YoR>KF86`>s4vOMAxWNx+1biV&hugHSe+?!(9RYObZ3=<3!Fen&I4aT zj#AhCQfGZ076hwG4tlmEK9HoK@vY}!G@XaaxRN1XP+f5;a7~#Z3{w)* zrLH@GQXwxtg%t{gI4F|gn3>-UnWkaXZH_?vV0p_Q@k}r-S~EK8uA>8wQ7esZ(jrE| zofTCh0ENd~GL`BLwN7n)R7`&;l;nyfwY5P64||S0=t)jHa6IS^zK$R$U!D(g2;})_ zGvI#xh1%5mw$QgwIf_Sx(1y;%(w7xhJ{^VU(YAaQ2g%C1Ce&FapmgZ~TdNaR6HqEl zJ<@_iT*t@L5Yq~w^gQNZFUf#OUH3Y^4U>#NJFbWe#v&}`fP(Pqx$+`?A2<+?Sgb#a zuv!9vgHF5=G4Z&9d`RI7^E!_S>Lg%45+nqQj1vsdktGZ#St|(+GVMr`Dqx66N(c)L zNs7Y~{y=HPdVxf1^m9WB>v+?I{)z^#D8&qtY|^f zx+eHB81!|8&u=9&aB7A>iADj#EOH;o!)cL6;i>w?c&8P1^Ct%3tvDy`P<0!aR_OP~ zVYs3rP#k3G$GTODu3`DLBr{NR+RU_>yq?MH`m}ncZcP;05kWS#X##%Gt03h#Kiv+0 zTyntY1EV%las4N$A`|@~SP!g&TC>sD;CLhUdLSS<04To*g2RDLg|x_at@AQM}*h z_Xi+dtUG;yB!2=Nm$cSVX|0PB6VbVmT|jk|Ca$EqDZ1_RHgW`X`gyzMk`016kPK85(ShN>BgKC~T_!ENQ2u3a; zfsDX?>*!B}I}NuHYg`N;@RGVV!`}f*6qp$%fchL|K@Ul%N>?YczY_xfcrjK9o%~6< zwuFSB4JidtBUwPT5M?6xO{+@`bn*vfNrqyE^+Q0Krn?s9frLv{i^=jHA3TO^T5XJ=B8#$rKj|7;DgqP}&TkH9}_!trc3| z4dQYS%pxOA7St`O0m**K>=4xpEjffiMTLMvO8vpufE*#d#9+EV9_jW)>2#Szo6(y3c)x$G@AwoTfOT>RrPVr``?)(pN2?+=lpvSzXHij{h zAZJH^2PYN*7%M?&AneCXc*PJH;;LGY?XH4n%(6_pfMP%uaqtjn;B=dd9=!QTE{ zQz#<%PyTm;B*ZK_G^fE}3WqkTEq4-i_NO?PNUHx!^>=c^^hH`!DmPIQ7j#aZKtiCi zzY{~EvSMxM=b{fmFi$@5K`^d^u%(Gy#7K((v|UFpbI{RTAiWGsj!0^AT`IehCWzt) zq^+}(VeA<~h%H}81M`)|jcZuZIL-!kUI53!#WA9vhQ2POn~LAwz@6c|Sq!W|Ab$tT zF9)8+^lAN~Oga-CBAtV-7IT!~H*oJcbFNH%H8?Erv&&{q%Pu>7U0wa4SHHJx$>blr zeBGXZ{Glt4t;*54>32SOP9l%derA;_oZRNk{Ri>ah`*oOO5KL7%9=RbsRq6dk$=SR zI{fiiIPNq`89Zgl^Rhq3Ul)WiEz2pzAF?YR4JT$eid1rP9KTBK8^dti9am+uCd>+| z=2>fJC8!(Z`p#K95%Lp+B&%P{dJ5MsA|ye*Cb5rB-Z?8x{dtyuc2MQbX3FlM399$( z2?#$&LMnw$6*^Dove_$<{z{?O3B6h9p^gmyHmE@PF2) zHU!mx2GVmHCV|#9u*SI!EVBhPO!3J{jn9yHI$~Wcu{f2)aW!_xI z_L$2OM$Tnv6X!l#pQfhGWq)0a>!4aCv1{kD#;fIeqtMMl?-2TZp-;_yZEjF~H1{*m z?0GD+bRNq*d)|5Tf@+D-%Y?2Mx<%*?p+A%Kd*u2hxqeURKZJH^WNCSg{TjicTu*P5 zw#)TGxnADLwnQ4sKsQSGtwO&qvAaOevYx{Y2s>9^UlV$}#QsQ9J}n`yEo8fX3))5faUr$zbD@dN zyv_zq!!zJpQF3`RHTE0{pD1)TXizOic$&JhnOe6I*Fkk#Gj-tpX7>1FLZ6c~Z#7e+ zK5G7KF73$9siZujWT_N&-_$2@t3VLU%weDrI1!#BaY@sjoZ1^GA4^F*0|hifC91H* zO_#Vte0`E}t0XRn7eKJgnfyGl~_pU!+CHBLp4uXOr{g1#d4oi%;(^b?4iAgB&#gz9F{GJ_^d+_jRj zo0=k=-41lOI?JG+0!_s0LFP%^UV|jUE+LW6-mL zYJnn<;2S`Bcs&SG0(}6q5$FyqtI7F>%KwWpC>`oAs#+m~sFRLD~gb7v!lDK`D4oYt{vIYOr;q&H9D{olwK9yCvT! zK_d;CD5zRcin;(OPmKp+?ae@S>UQfDL6-`;(>jJyQq($0dAF77BibbBIV)Sx?Sg)1 zl#LRAe!>HbMdskVoq zOr<_HXr$C&U&uC0vqz)M6crFO!>;zV0;LIBV9%5?!$5WF5+Ih+7wCjqVXu-JhD+R~ zg79vM3$cHyuCu@4Lq@d;=!CjMP>Q-$;&uS>S&yFpjZk;nTYcF2QjbX7-S)R6?kUOl z6Z>{wXQX@qDBix`pg+Z+z|82l!WdK)gXYGdNDR6o20apkUXMW^$DoW^PVJW3tzOKq z)cZmM7O#6+FM|$IuYpceZ-6dRzX2U@y%R&HM9#C`&6pCY6S_d?YN6K&y;bP9UZ>_(9{?Ymr^tg2b^mEJVg1cdMJZL97*d-yMzL#>8=vRc!7kahO z?+D!^^bMh(2+fFN-m`?x5ZWU28=#iDEsm}JK^*1z)3{88JTBqS#)WYGN?ZZxyF$N^ zl)-qW55+UKM|?N8UA^ObqLzU|M+vO~by|IKd>_Ov6WSv5Qcx%M^7w&>Z54VAs1tre zd>O)T5&C1H4-0)>=&PVUby(>8@dfVnhbY0Pj>lJk!%ySS20a08bxKPG6Ucceq0&uX zl+Xv)WeMXDUIFS;BSBNugoH_;=L?;la6V#ZCQJvNlR%j)2KA}c2^WHXRp|9XZ%z<- z;@VPA34KB6!Gt*o`K!=WKhyN~lao^a%NYr(%70;(^CIU<_1MZzyf zN=sb>>QlG-7opy7`!50gk$)A^>_Q2adPL~6escJt(03%{?5deNE`wLO%?A6}dhWnvnQal$@5>3YwL8wcAtqi3^aXC#aDj6}BmV!6It=nbGgbsKW|)b|tTg5E4r`l*CJmB@ZPAoQTn-wJ&8N}}$y2wj(S3$C|It_OwwO6coJcOm=(q5qJO zgpPMZhf_OJhM|t{g3o>(IU+`N>%mGo)-DD(2s?F0qUgb9sgs*#wU{og{FWGQC*WMpOWNXfPN*Jt)83Ab}bQl zxrAJuyc;3xM@xM@nf=KA(vpeo@tcyLL+l;Nl<#6}kSs(7#HEuM+}+0@09RX^=n*zT^$Dff#kYXy^rf3 zs*gZ_ralLKOi~_1Uf3eJ?v@glc`Es*s;ZR4Oh<+nr@RE|tq{6K=+&T3?8cPz%xRIE zK+lV8Pht7@q!gg9A4%cZd^Y9sE+y(sgjnim3MHJ{;cC!NB_tsgHpiW_vQbWIDrvUR ze4*Vzoiu$?^ATGrbcE0epib4WzNm6rnjndkQTUI!tJ#&u~1^ zq%RcOM?#8)4ij1>^jx8Jpq6UtJOb$#Nyr+ZR|&mI=7sL7PLn?x$Q4>NcseX443QCLeCXCUFa;KO+uFmT`lzL zbXwGnxVF?c(>b#42KA{Y(kDZ=If@h1^Xav?enZlG;g>(3>TV?&aGhS+I?Mkoh-Do&`hD-g%)*L2>u5M zE$hOz50mgQay=2(=SB2*)T3{Pgv=4zDD)zs%Y?2Hx>o2qq1OrBB=lyXcL?<)@9?ap z_pXeN?{>KuoFsRlWbQ_K%r#x8EzjW^I^1PxW-2Tx{U6=$hosE6g?=dXGof}S`A-#^ zFSL))A)r$tV}wo?Is>#+&B~+>%on;;=qjOC2)zo_r@kii>q0jPy;0~*LbrmR7tyvw zTNQ0#v{j*nnG)G1HPXUNiO@z(5gRonLK`(DLfbVZvIA+Ntxc)=DM~I?j|qKF=&v&; zAmp&nKMDOr!sD{YXL1(DZ)O%H7S3vMZEr6-4z{;X7HNslvxJToI$mgv(CI=i#_TgK zGFz^jgf0@gLg;!>$EshP@*HNL>$6C=fI8uKX01U9J3-GxGP>2J>VEKFs&<2RR?ma~ z&gxB}?}Pf(C(^pOY__yhHrtpZGz^-m`U))uO;CfgFYJ<_M#=R!p>^2>2$?V8DCG2^`Q4j_|LP^Qngo7zMRcA9>Vps$RCAL1E)o(fzu+?z-bZc z9%f0Q)VgVrFC=9~4!QO0nu=;tM+o_})Xh0pMsn>E| zhAn+3=f=#=*57k(1r6qI2hGp@F6bb+9+Ue6Twjp;6VN5OyFk|o-J1I_u74o(vE0XS z{gPb2D|tW5eF`DTp}nBpLeGN^2{FxALd-Qg^b+WDTssoj5c)MFuuo8e0o`WMgL%h+UNPvgyiYT2b;zKDc_)C58uU?~o#j(S zT^0V@5a^O`<78W-K_l`5IPJFGpy@yf>X1P#`N>&+mDNq>y8$SmYBf@K=ci{Ss)#|m z^N(gGs*NtnM%*4jt?E#Ic2-cObeB?;zaT%WgQ_(sy`X1SCspsF{#j{ix1d(lvmiUG zi%ROD^NlSSoRz6Y8Z@QgcxING=%Qg+*=n1hR@I1nx$20Cy9y|zj+wYk1tYWaSRn4V zQM%PxydOvOjCD`JgsiZO?k_lBH(cT#FPN3pQ%x*n^m^o*m(@$v3)&F)WkGsYUz1Ol z=^&Q5IIDkDnJrlZUBog=)#|7+%hX1<%qz3FAMWw#AeMPm)-bn}`wPC7HQYrkbEMi4 zRpu!5kXz=~tZKDiP^)NGwK^zhi+ZKtTZoJ6$%3}1BL#P6;e#s%9S0hxW*U?b{#Mpk zRHH$u;qPTlP>T!-0Zmjb2K5X7Fl&-<7ExQmmbx!%vWqf+YFw1B9?UvVMI@ir`6=pJ zL3`Bj@QKVR>Rv&usw#XmvsTsM@i=F6)T$Oit!hJvaoY@<5q>1AR&CcQ)k5T(rdp(9 zT2)JUPu4Wm12-cS_U~JP>eN2zrdIW}@V=~>DhcnmVcad@SF&cS?FQW&KAt&8?Q+r4 z%zAZ55Osp+h@dTjpNC)1s#pD_v$q6Z2>%wS%%C^IzXuvFXsdcRd^D>;MFi=#&sEn7 z+N@55Kgya*MqF)m5Vhd%S&b&{8SDOn6Ilyf^msuadyzp}BNw}I_Y@@KQ#AaKI)8sb zdNyB|r4jS3RNJL?-J(@$r;GBlSE=2CHU#Xhh1sjsUV}P!?G5ybK|Q(-$X=rk88o#@wWs>q;gyB-HB zGiY1atyx#7;RgMv>zM2-)Hs8lMBG`) z%KUDNv%jwD4YImjn!Q=AH7FhEMzu{4OSvL@i`wg=qnX>(ei!9uZ&Qa%zQk_VW`9ei z<1^>v#p<>t`wmrXP&&|^YNDVGf!^H;v$v~SL9F2xpp7od&;Fj;=AxsSJJohUThy>_ z-_72s4jMEG=!YtW#}`oFETA8&aRx2z_LJ=U)FOjgf$mqE3`*?wVDTqZ-SSH z)qaD1(Ct{}!|I?QZKWPohfTi6x;=rES-foseR;auzU)U-*r1n@?-5n3k&MPiRJn_e zBd*Ft2eKbkHG-}}%7fXDtC?=x(aa}Qql=CMEpyR<>?hUQsC;|WwQk(e%xBal7aa$> z%|!>YpH(}f^8Hfna^sF>{z^UKqT@h&qf+iuuefnXGha}LTyz}hy{MEgs^f0l(aZzt z3l|*+3JeyRp|uCHUsCCUblYEH1pa%neU+5A*fY-)b0K3*HsPP0fI6S_fGa3s$P(`Zf~lEf^;cwszYwdky&r5D!gff zcK4%hA7&p?UkK8ryrmjt3e=_iMlBNbREICR9nbuYO2=D2l+tDXR*e&+Is2`u6~r<} zW*t^L+_-nL-&U^((q+D*4hdQxNbP7E31lbdg3 z*88dlUX$Up?~iJqAYJAk)x>icr_214s&&!v%s;6XjRF^-MMu>pgO;I1N7X(-o7INy zopU}=RpY%HK2-IBS{3{DLlqIUL2d1xlk;b_(M3ISj;Uo|VLqmOC;KC{NzexM?d}6} z{;H0Gpv&c|xFi!RLhR2>qeZNV4n zh>3f;dt=TQYPdKUThz-yC)7=XwyO7m{-M4wadwa9oPVmUb9D`NkL5X*Rb)_lkJUN0 zRc=u49$(GzSu+e8*5jI-cx#hE%60I);ZBdJR z+?vzDiqz=(HUK4Aap!4tXOA5@9jzl%G`hFP4|9^OWwk_G)e}8_n$yYJA!xHY(Bna% zz*NRi2!h<~uJ z)>;=G&FpDy60}u)yYTNhJ*`&^`eETea*C|mW=PuuKQFv8tFQHtLC*==EvPl{a$#Y1 zUu&O<`;(wU1_gQ^&+KcJ)v=UTmC^HPWIb~L0mPXA$L#=+ZHH!2+oHNXd2-3YW!YZG` zxDA2LsBfgTUC=X%eKgWKT+g^?)ZO5-(yD0?Bt2GXH5$YotF#sx#2%}(S~ODZu}bSI z6UQE_v^E;V9;>u&GKf7^Y29Y>vB#>c9R{(-##r|V(j#@Obx_b&^^=}mbH`c%ab35n zhk6#}jrz+ps~s1vJq*X3$ae%DGmNxV)|Ea1M`Q7(1XLk3YUb=Dq}k8-KA_L?}# zrOw)K5am*59W;n?sk087e3Z)t)_Vp~E;FrTg4PG@UY};pvXbVLv-PT5ucJU=L0eRD zugSTytksJcw?&QUH6wSnb*&(6+2>dfX%v{&YgXOFu)0@acD25l46!=Sqb_0vfGyw^oYd96Wvf#z8^nUt@B>-pAg27S@%1kgPObuaof zbAh$Xps__Kfc6-4anYr@3$1+yttq+!=oN#mEm{wB)S#PDO0#v`pdX`@W-GKrq!f6% z=vd}ORu4fN0`&4OviceH>!Ra8yA3*0bbao{)?R~-7rm5ov31O#xZa;;F0wu`s9W!E z-rq*tLk2zAdu!GbYqvqa6tvf%-}L@|?h>nLnda=Ty$iFKSj7f?jy5c@$_?t! zhiIHZ`F(zfd^HC3?{hEEL4#<|mRe<(=rV^R-!f~YK~wsi0GeUYMSUL3y~L_FXkDLQ z04*};TYa9$U2e4)^rJq{0!0kkjWSnQ8x4A^&kMOLteXt_tk26p+YQR>`+9DRwbP)! zeSZVA%b;`meww+`+G|i<-xEMb4O-FnNbV}@xIs7d{UZ?Gk}m!C0OBsS0)ntk>iZX< z)ds!R_v73()>SV0XYS?Jq7}@yUcJ@#Xy%pHc0n5gAE5Rtt(^vag4(aNb_voxU&Pug zs8#v;9nFkbds?KFK*xTC*%7N~rAB@GZOw{URf1XrBPFh0&;~U{@-1`G36yfJi++*Y zYHfGXOF8STdt7upbG`MDi-Mu6tbHy@32m?r8+2j6VbPfHn$hRhRV}6WV6g zUaBQ=L%-{DZ?QHBYE^gkn-sdm+G)^z;PX~%zd=s`-DVv(Xg|>HR?=#g(yHD;zB{ZQ zf;Ou^_xo1Xc59r8`=Z~J&|TL4%XP}6{uhRJSof^esIY(U?C)9o3@Yy55cS4zsjnEuBye_*vlG@2u5WUC+*>3>uK%*okFBe|Mzlp8>VH}2UTcq_&FXLcXXO6Wdd0+*7p@E4 zZ!O!XQ~CyM3_W0N7qnTW54bV(pcT4-aqCs-fLlU8vsQnds8v-DxFhtCwZovr1HK#j zxfR}|{EykH$Oaj64e%6ZY6 zd5cb2Ht@%x{nkUbYg9S#NbUiv_zsO`47@VyfR(jfqe}*Unt8xVzl&(Ix^m$65Z6Oc ztJ;jXm#i5E?Ht%U`z5R8+dAKK19yd9wranx(Q5+>vtP9i8uZSPlG59+vT zpf|0Xex^}f@e`p#)}DtoS`PFZYx~cMHjB4?*g7a^gSx)>xzJ(jh>H${-nPQOV9E{Z zM#TNj>gS>Zp(9q(BRcL|#jl6nwd!5;`_Lb(T?Xwe{&VO(Yqvr70ljbSbK^b@{n0w; zqPV=H*3L(DnfDcc8v3&pcub>5QTt!4bQc{6ePoR@XfNW9TeU7a5c-={Z_vTw;<@;OeMC^JT3k|*S7@sznUAO{ugJdbDJdneq2$xd ze)bN7wv?Ozy4N83VEyff4BB4O8)%O~KPf599$@b?=qbbvun!vaYm_+`DY@?Sb}M>EIRx4Gz#xnu0Wb57iid1LKOF8Ws9 zcsu+niBn4;!HIUgpjNe}^v1kN_C6gKxTf^Gd6Vr!25l<6C$Gj%+9&xC_gv_Fd&UbI zZ7SWBH^pu-=$6t)@}}Ak8FWwS(?EL-dZ@H8d#Zgg+Fo!dP2$ zD%+n|XJ;MIC=7IgT?Ry1mzBMlccFccpjI`q>`2~hyXYmUK}{?hncZM-GiXNH(agE_ zaf9Xys(D$LxvK1gyt(!wgRTLZXI~3Mn{_KvHrhuFx?9jl+3;Pj9xf}(ZnW<)=;^Xg z@|x_jS0!KIK-t!;1@=ZDwgJ1$`3vlw24P=0f1$lcr&OH>cgSzHN4~~}5c#Z`t6U`Ip)o4T=D* zws)G8TLvG^Tw}+*uJdgdR4-_~`pID2X|neMv6M##m*ih&A2H}Tpv!IbhUVps!Nc>{ z+AV@Ms6V0hui6n81w&Wb+g+3rYPEL>YE^$991N|uXS~Hy=+7U|yxP9aMVX-u_F)$V zL)Y3pe&eJ}30-f`bWwHwM*B7wP0as>z28N(`8V1Vf6IJZu_t$7{!R8w7tPK8roG5T z%kpow*ShGk{9EjeF8W&jZT2=7eKY?Kdxwj@mw%UiuZ!-_-(i;@cItaJf2TdpMK9*x zZO?GgZ}NX=FLcrS`9HE(yXf=$d+n=Slu+U}{qA87Q6phJR~ z5_f6rnhzOA^is}C_9j8CDsAXXIWODW|E%+s3@yxl#g03s(b+@4TJVZp{}+vB1O3`A zKTfnkT{iT1<{S1n7X?Fa+A~~~8G6fZbWwHwZ|!9++EDP0z1BrH6#U-aXwcV&-cazq zeVZVx>V|%^-~)UA-*kQ7?tVwXNA@un{h;8lcFNy%+`~hER`55w+(j3L{%+SB^dk8D z#NOkgl+dSk(Z@R9i$gO*pW7Q)oMG7sUBi3wql+K6F1& zM9>D+wVdc$L7P>-^4EYiX(S$eyl;n28K^GbnicQ6$DkSIh1v1Ghcr?P%Ns)RzC8wA zQvOy!f^Xrcn$Onq-xmaYErQmoub2O+An4m@;&zlD&PnopB1o?oI{6wulYE$Ak7joA zwP+Oh32N`;yULAwDW{X~CKvssAjP-CMV}O;`S!Tzp9Sf@BZ9d5>JMl7vObp@0^CE& z@f8{Lbor;5Ilf|pUM@cYG+dD0H_i1uVi0$i^LZ>>TxNq9cx6mN&oA&T66ZE$AcKOlF zLf>i=$DQs%-!?&7o`t?0g7h8tLSNMha@MN8kbFh|&?vQn`5qFqUKI+O_)o^IS3@g0 zg$sS}3EHAYS9A&Y^5LmgiJOGDzP_1!#11K^SHQdXy=PEUML68w*C_H4WnmNI@ znh$fLzVnc8g73Cejb;H&^flsKALE*bogbd$OV1J%xOCX3ndkaK2Hl9-&-E2)1YdD_ zc(Sj|MGfKed{r)56t4Bvy6Cd-4Btce^b~8L7dy*04j;!N`q8k$>{-5D2HiL8y6`OD zwYfU(7sIxM=lEX1H;b6^m&0xe*ZZo%L|U^Ne5xxE_u#jO8+=JFx;s42m*t`d!t;GS zT=aOj*;n;{+B+AxsH(O9uge~0a7ZDv5k(ya5QdwgmKW~V#4toKH8mwfB@r*6X=&n7 zOS21>S(KHgCBEsKm>o5(G|lvAr6(&rX=zz$S!(Jj%<}!MXYGM8%unb4|D6Bl|9;-r zk?%auv!4B|>t1`$o;_=mw$pciuf5K3ve48%@AY?RQ?(~utuL4JOig`KESEo+v)p#uf?q=$W&9SC#{e)eZSNMxmu^uemhYfFg3N`PLu~tP3^Z6 zB@0zK?4oz4@@L(w@|tkH~6MQ@#0!WD(T5)MJmzmZqk9>`@s>n(nbj zs>iBjm8q#7tCsV$M&I-< zl;=%N_1GeL$<$PjEtZCxV$yeKPs&QtX0d)~!KY#?;5ohDo^&pgt4(c4LVxEAGA3E46(^i>ESH(4 zwz=2QHp^wDsf|I&UXt@XT6llwOLAnY+D_-UQZ6D*A0JlAC0b*X5>7i;%EP8MB;gn5 z8oBEho!{LFGUOGR*}pN$204PX*|ymU^^Og4jHxY6_!U|uY5Kdmjk3By`_-{guGgNJ zmvE<(Y>7u|c;=-|vYV-ucWo82Nv=1wHxg=`o8|f2wWpe;w#Y?8v=$T)9`uIXJ5+09 z6555lArF(LYx}138>Z4`v3C-}Lf(`^i?rvygoKdY@}Q}Gnb0TXeQ6Y{w8vR}!tjt! zWF%>`*ma5Spu;kFq)O8@IwHeJ(>WZGJ4kz+wMm>1azvgYZ8i%@oE-9*>^xfM7X$5c zSzW4g=$<$|%39JMXLlq{YV(8KXli#QE(tj;caf%ZKO^^%rbfu}kTduR zlgeF}<$_#7+T(0W;(vx*kW0%OOI9yyNz^GjG zum=;vgD%Pu4ceO_7v+Qot-tdZIj2F}9&$-;F*P+pev?N{Z3&`WmcbKr%$202n%b+R zSatdHPuJGjCrP}dZm}~l&Ps+>18Z6HPtJs}5?FwU4-s{|ic zk`XgU<)>P=xhuukXKFVl+~7(x2F+Dz$M{^dV20s;KWV;?B*g_~7_GI&KSC>I7*11D zpK~&dk*4RxqzDA)+HloA`;in9t>1iKHESVu&)*dt_F>}B!x zUj{pVM@!Trr;cRrmRt{uVDEtVjTDWR-&+joBg++i;{WylB&z#?fLr%o;Y0^;v1|dWD8S~J*iFO zTs=pRzjw6khG;%);5B1&5D%rJ7&JTDxGg;JDf~7XdSdoZi zMUP#Vr;)-&;VA^DH=VyTxrm3(HBMN`EQY%VO4juZynXKrDSkDW>S7 z;%FZ~$k@|C$=Z>^d#pPPx=K7?dN!E~yY zwU26ltky%RT2?-S`UTJA^pYDRNHeuDj>n?+BOS+^YAzM56w&aQLyYY!sg4DL-Ak$Z z*!mFVy9o3|)|ThUXBBZRaRVsWyCmxz-zUqWJ_6f*O!i}BIZm=3KWc@C;cLJ(k8YNOR0z+mb^g&D%#=4D%S_ZP$B>x8>^FdOiiHT1fWiqcx4cf@ zRlTo$0wH6)F0$y{y(4Q&OB!j~egpY8EvNDkOwBpcoO9wRrm{<>&OEWYVUuljWR*GSBk2GU?TfBW1ctuw61$(N&;^{kWSN(`}yu4By z`&yr&U74!=y?q)jh8gEYil*qvSIc_LG|HaH+M;7N%2%c~=E9kG1hthXUws78XBs-M zM%gol_1T5y0UB4{7H|0#Dt{f-c$fA#}TGpw$<#l95!FItDt1Xg$Q;R+` zSM;2LYx$q#-zXyjmDby$=k4EHj6d+awjHaj^i_MAil*tA;jeAcqfVE>yF3AihPAaC zV(MtxVwih@J{sOgK8k|r^M?eIlgREZr;uHphhw!ZnvwJzu6rSi{I#slR~u!?bgCkb zfY{b^w9@;p9w*+Bn_9GI(@z1v;fxo1J>{r`$)^~+ zGIcDaj-%9zbS_;@p9(9;Q;$Yv5fqcN$>gu=8+wDX&nC}qBxi&AGnZg08dfWz)Q5=+ ziTbnHlaM9T_NEr?srdqJrCVb)WMLlN8fD4Wk77?&2|1l9;aXWk*{-zw`SSn!O0N58HI-10Jv|N|qtW;+>L{2VrTJ7}Z9hf!(;!y# z1Pyipw6NbmJm~CJ)%*KsWd2!yD}64uv1YWbZcjgwbqRIZ^a#Ztd!>C^%TY4G?mkp^E7jUYTltz>HEkc&GM<>-5e@5}(mvaG1o569B)fs;lO)Pr&kx!&oh*94 z^OkeSemf|szx4GG&Wd2c`9JYz%u9k9LCU8EXkfiDRVpXQ*;I<4<^;(mP&?>+^`3Yi zMNoS&*7yW*jh8ICNA!8G-lHEQyOwo18)eCKs%GQ1SIz@^UecpZU;qE_wNL5Nu0T6@ zW+ZhD)?&^}O=p!qGxO*@LZ4Txrxw;DU(0G166`Iqd&?gLtN!x760X}^QP4GWdBrvJ zy@(*#Csgv!L4$n@T9_(7R)@W%J4@}TZc3}R~4 zu^^^a6boW%&9NY+)*1_8y^{O5+$=r0z!k#!L-u8>JB)AzV5=;w{xvvxj4O?mBu{eX zvx&)jgYwzE$@PwWHb1$8tCXo#xi;}9lY?*A#Gg&R+cgneop(%RtCGX99?`mFtO3I} zC(ppPwe9W)x8wV+o>ZQN>`3y+HZ|;rZ$tk}&4zWIv53z!jw_zWaa^4ZbN5Srfe^zVG|B|xX z6%Tozt0#XbCK$iUY}zTXE4YdG zNJ|Z^<0)x3hi>Bi(^4@i%CQ>5CO#}J7nadv8J3nG%K3z}GmdS1TG~M5dtcg^&_n!@ zv~qB1+TEeMQHB|zIc!bZUTnJ+Tb<>*(|!aGr`5a8^54?thUQbfa;V)D&*O5qS`SC@ zU{HWiwGI#>eL-ju)hh@V^tGUSSV?w^ldc08QNHPqg>GW)iCsXq$V#sPhY;@~&LBRU ztn44B)}Ssu($2Px7xU9cw%Nq1)0c-#E+)$3Js>(g%N|<*XbX?{vG^dU~vb< zFh|Nqp)u@S`Vn|uPQMYUUDLh}t>+LH~*=oog07iYwT)rhi;u3-yB zRmK@dJ+ID43|l6?#@*UA{8VZOmnz8+YM-nyJn13h7I1k+epnsd6H&+1_w#kMT8LY$ z$rv2w7Jtnc4!)UD@7Rsja5~-M!;BJGz981Nn;53ra5^kMpcZa%F(W+4EkvfGAF&nD zNsI>TM7PZT&P^CCv%?M{=6tYcX1!w;6w`MLu2}fkU5LSoO zQ;s^S^+{7!>!#E(b@xFXQ+FNI(H$XmOpT~I_7v_es1s$GtHSEx|4JB_PiJfh^OYDC zVFBPN+*Lg#(~Wzi=Mbwi-v|qlHJLlW7c=*Ssa(!G+}P?PwBc)+pN0j=*E3Im?`NJ3 zizhjr%Z@mZm;WD*C1HDswFOAS+&O>7+56<3M-vZBM?@`0>)@X@Ru z;PKRyaJP6eD;sOh2-Z7G5)-iP#$4Er}Ahe9AYB3A>*0!4$ zuI4VamfY9fp9tSVTu(FDD)AG_yo}ms75F^ro)nHbQ>wdFlzkOO_}ATQ!*`JX4yNw% z*u?KjT!&K0>)ITXGqam@tYfpY2i~xW&CB-hn8O~(avZ0AJkDye-5vMS zh+QWBBfGzInb-(&L$z(ad>gq3K*oFvV&s$TCdPyApq?bB5p#(7#KFWOVkvPVaT@rm zV;0Ht!BdWfpd+}3p0VCuee8=i6XIX<0qX2-#9>?GKO{QxH7Nklf5iYE}+@N}zR!QOcOvW->%I@H5iQn?FwK5IdDDnGMwng3oZk7GO9dZD;OWqFd zlf%IS_@xKhN0x$zWjR=DRDi3Eso+{;2Dsk%3%JF20NiRk1nw{vf~Snd;2Gl?@Vv1U z{MmRBykz_bXjonWZI<<*pJfy1Z+R1JZP^Y6TXum?%X?s$PPe3jRhBGpj-?N{!Y2=`^(h2b`wRxx`rHAo_bCQ9`iud$ z_>2R$`b+|M_}mTd@|h0q^}&7lEYf;E7-L-kcD7c7-Kb)4B@m zZT(L$*ZL~>kaZ(iZG8h=WPKZa%K9$2#JU$;YTXa6uzn2IT0aF>TaSWktzUubt>1zh zt*5~)*7M+2YdyHb`Wv{*Dh>3P)dv1-y$-x&y&hyX2WZ%WL7OcE^s{vY{cX`;OIv5K zwe3bQ*wzbl+ETzUTP8TjmIDs8-3pGd6@VjcgTOJiVPKiH90V#8+6*=IWWaY=y5MSnC@AuJ*kFTcPIZf!Oc+|jHE+|_K9C63)<9}5=PUj>KQ{|*-0 zzX!+K9X@fa!tMm`wciTPwhsXp*hhhn+pEB5>`#Ns?MuOz?XQEc+PC^-u+8?J;CA~y zaF4ycHG_R<&#)Fl?rp_yuM@@cbf3aB= zSm75ci|wh+Gr+r=7lVtM&j#OYz8pN!d^>o3i(;Q*dm{L%eH1AD%33VpMTT#&{g)Qo!EpcWzOUNzKR1 zzYKiWe;c^h{}{O6pNE~Zf9xLue(IkF9`!E*zw)02e(S#sJng>?Jnw%DtoP^P=j^}v zZw(LilL4tw=j@pQBfy-1D)82TrC>q8QE(6zT0dtW7T^T$3`hk>2UNv|`jrK+xKO{B z0;<4o0=9zPt{>4O)NkJPRp6fMv9zaO^S~mBO1C2$02Ygq+$X}J`S(`n_P@5mk68RR zw{n78Ta5tUX;lUOtre#y4-dvwo=n_^dpq87VHMAT#4Vh-YB&_{RS<{aeLC!S;C(9I zhvU5x?<4SzOa80~@3?@(?o{viUkp^?uHccZZA9CMFuY>%x+x+dBGrpGN90EI!)rjq z*oexAC!swb@nXcw4X?Ek>h&7EUXM_(ZS>k1@m|D-5r@E|;8DDv#J0H+KR~(=QBQxD zAzzO0iM$X|fWI-3_eDMt`F!MRyw*kLMr?@O9Qk(Se!PxEo`!xQ^4G`>kAEib{&gjTjy^HmV|OcGQBX4N-fdK8iXV^+QyB6pL;i z-5P(n5mC|g@XC$o3b|+W&Cz|MOQPpSFNj{*@LC=H7WwRo_PpMY)~^pE4n#M;{t>NS zN29++6z`XBOaNYvn2s?b>gMRqF(b=zY7V=u+Dj%^pKYNvTACIZ$7*dt#^%1>nUbLtY2LFxGr%UA`{~>;x3_t`sImp zAtJ<`6L(u&F+9rSCdb_q_fT97b&UwLv=g2%eS7 z@XS!$fP-gO;W8(lUDY3hmt!l5Yx@SyxGmV$2P4~tM|ihj4m|y`HJ&`%5wRjzD;5c> z8`cI2Mlc_-NJzmaZ%w`44Bka9*B(U)QG~zf|@pOJn%l%U(o&FR^}XC30Mg ztEZcgd;P6R9r0|-ThqY6yewiLVjkEguKK4O?B?XE~MOy_PfJ`4;8%w|+|ggm|2ImV8>~ ztCDxipA9DG&j)kJGBjV6P1pUd{6`^AA$xWHBFInXKMlS}K5O!ygS?rzhwKN4U+1e9 zxIpyjzY?;ezp8uN{wl`^;!XWuhOFBmjVy)z*TOQU|7+mgWU21I8S<+BTft3a`Jn$h zkWUeRA&V$bk%J3Vjk9Tm*7fpk zpY7zihp5Z&MZqU(E3dliQe7xG0=sU*>k3uwx^~|6(zW)kS8(B%@Qf~0WxlEKB=HQG zQ1}zrrx3dk>tCqqIEZ{kQsk+Hs=f<|PZL*>&ub*>)_%88)%x0_Wk30xD6}IN-9EZa zexx`TiPw&xTTG7@IY5=uJKCR*<2yi=c1ohE*Z)}rox6+TG`lqbHR?P-?S0oSfARn| zKg=57h_Epq%xnJ43aXcS@6O6PVQn`P4o~yI1 z4xqrZt&713UII%bD43g%2BUZ>7|q9mF?<}@iL0lRcLoKE=My1!0R`*IE5L4iGAuWO zg5AXLhTI(#xI!}x?8)zir57kz0-pgn5yYL%d?uL8XMrhvHkiusWOJ4V3YN|v05kY} zFq1C;vpAk@&ay$=C&wQJd-H{04u2f%!=C_e;ZK6Oyaw#cpMn3a#612iEdBWNu;haR z*Q}O7E&v6t6)lH602J&t{vtS#uY_d~h!MqCLB1Wth~h6p9tvVa@ima|05PKYE8s|8 z2TKVkaE0kru#~?B-o-b7)A=TF9^VYk=Wl=?@wedrF^F$Z`8LQ0LBS63?U4Tg3ic^~ z2l8Q1up|6k$e)1%&sp9L`6wvx>%TpazW@dMlD`M}I4Iax`~%2egBXW=Kjaf2e$~c5 z1i$4U!SWr5XE^asAb$@E_5(iz`7|il8U87FmLCCsxD2)z>LKkNK*5|sf^otEjuKXIzVHPf6n5}2 zaUJ-SXaUxU0BrR%DA=@Cy+Qeko$XuS6&CYY`9sZ$PxX=nDBPh?W;O zLOutgsz498Yl;_Fsrh6w9eoMvtNw!$L#LH%-j{{&uOeT%V)K5w_}DM!zQq4IDend z7UDd58P40+;oNyA`+%*9JIL0?ZH(KDzwP*YFK!=r5PwJUcLINB;(i9-ixZtT#x=tq z!`#U6VwfG(k%nP@Y>)SY51{noIJiJW&cjoUMJ4#K*a$u%HZJAtQPJZC&Z@07J*L)zZW@MECzv3im~8RV(dze(K)tOjn2=(XT-o&cs`r>WDUni zHLBD{W_5h_{ELIos4;eZr{6}YG;dqmPL{ix+O`jCYOB49ZS@_$_q)DR$nf9W+IDJA zc_=&DiRH9o_?AG+Gawh@csc;b#oKW78;HL__*65P72w!ifFpMSj@tz|Y8T*`U4SEY z0gl%N=*t2es|#?2pa53~3h3OR1`!Yl z;ds9lXN-B|_l9vAt8l4(L*=3N5ET>W8kDN;Qqp75ROu~~Y`0;YO+uVfR>n#Yvz(1$ z<0&0?Cg8mgsYS3>AiW4zvPzL!PU#Ha&qSiEIJ1C#5>m?9=&M9B$fq+t_v=?TjOxya zkV$h&2I7sws{~tDA{U1JqXZrmh*t@zALU+x+@08iCSXrcr6@su>R&FdFL0bisu&Z< za~fKuh~laAJe=oh?_x-k*c5E(L>b3JD>q|#YE($&@w7xHJS(v8sd`O743F2pR=&V^@1*SIqFj8Rii&@o4DV#O&oHXia+(Q z5?5i=waOCoj*6yQOC2Lr%|_#Rp{`CgwK>@;v{V=LR6OYX7g|!y$wR3gd1fAJWT>1y z?VvQ(K6tMHS=Xro_9P5`Ax~3>Wm3t+$tY*Z$bOSbr<9hJj4rA8lTo{RqB`-fF%AxQ#gkQu zb4#X_lsU^3lUzj=IptHvk1d(xa!xKyD=sdnKr@aiDyt|lD@8#%U8OXhqIbHY?1`Nk k8UYT8ojg4R#na>e`~Kge1^gvl3%`Ve`v3m>pVtEa1;an_`Tzg` From 2e334afcdf4b4a6e806d67201b7950b23e027a86 Mon Sep 17 00:00:00 2001 From: robvde Date: Wed, 4 Jul 2012 23:07:28 +0400 Subject: [PATCH 02/20] Violation of Primary Key contraint on UserSettings fixed --- WebsitePanel/Database/update_db.sql | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/WebsitePanel/Database/update_db.sql b/WebsitePanel/Database/update_db.sql index 56c023d4..ebfc3189 100644 --- a/WebsitePanel/Database/update_db.sql +++ b/WebsitePanel/Database/update_db.sql @@ -9,10 +9,15 @@ SET @build_date = '${release.date}T00:00:00' -- ISO 8601 Format (YYYY-MM-DDTHH:M IF NOT EXISTS (SELECT * FROM [dbo].[Versions] WHERE [DatabaseVersion] = @build_version) BEGIN INSERT [dbo].[Versions] ([DatabaseVersion], [BuildDate]) VALUES (@build_version, @build_date) - INSERT [dbo].[UserSettings] ([UserID], [SettingsName], [PropertyName], [PropertyValue]) VALUES (1, N'WebPolicy', N'EnableParkingPageTokens', N'False') END GO + +IF NOT EXISTS (SELECT * FROM [dbo].[UserSetting] WHERE ([GroupName] = 1) AND ([SettingsName] = 'WebPolicy') AND ([PropertyName] = 'EnableParkingPageTokens')) +BEGIN + INSERT [dbo].[UserSettings] ([UserID], [SettingsName], [PropertyName], [PropertyValue]) VALUES (1, N'WebPolicy', N'EnableParkingPageTokens', N'False') +END + IF NOT EXISTS (SELECT * FROM [dbo].[ResourceGroups] WHERE [GroupName] = 'MsSQL2012') BEGIN INSERT [dbo].[ResourceGroups] ([GroupID], [GroupName], [GroupOrder], [GroupController]) VALUES (23, N'MsSQL2012', 10, N'WebsitePanel.EnterpriseServer.DatabaseServerController') From 2f8a580846b2268501ab1c7522f84fc76b70e49f Mon Sep 17 00:00:00 2001 From: robvde Date: Sun, 8 Jul 2012 09:04:14 +0400 Subject: [PATCH 03/20] Removed Exchange Hosted Edition Important!: Before updating ensure that there are no servers within the with the WebsitePanel with ExchangeHostedEdition enabled/configured. --- WebsitePanel/Database/install_db.sql | 14 - WebsitePanel/Database/update_db.sql | 66 +- .../Packages/PackageSettings.cs | 1 - .../Packages/Quotas.cs | 4 - .../Servers/ResourceGroups.cs | 1 - .../Users/UserSettings.cs | 2 - .../ExchangeHostedEditionProxy.cs | 950 ------------------ ...ebsitePanel.EnterpriseServer.Client.csproj | 1 - .../ExchangeHostedEditionController.cs | 896 ----------------- .../Code/Packages/PackageController.cs | 13 - .../WebsitePanel.EnterpriseServer.csproj | 6 - .../esExchangeHostedEdition.asmx | 1 - .../esExchangeHostedEdition.asmx.cs | 95 -- .../ExchangeOrganization.cs | 43 - .../ExchangeOrganizationDomain.cs | 14 - .../IExchangeHostedEdition.cs | 22 - .../WebsitePanel.Providers.Base.csproj | 3 - .../ExchangeServerHostedEditionProxy.cs | 574 ----------- .../WebsitePanel.Server.Client.csproj | 1 - WebsitePanel/Sources/WebsitePanel.Server.sln | 6 - .../ExchangeServerHostedEdition.asmx | 1 - .../ExchangeServerHostedEdition.asmx.cs | 201 ---- .../WebsitePanel.Server.csproj | 5 - .../App_Data/ModulesData.config | 2 - .../App_Data/WebsitePanel_Modules.config | 13 - .../App_Data/WebsitePanel_Pages.config | 12 - .../WebsitePanel_Modules.ascx.resx | 3 - .../WebsitePanel_Pages.ascx.resx | 6 - .../WebsitePanel_SharedResources.ascx.resx | 126 --- .../SpaceSettings.ascx.resx | 3 - .../UserAccountMailTemplateSettings.ascx.resx | 3 - .../UserAccountPolicySettings.ascx.resx | 3 - .../WebsitePanel/Code/Framework/ES.cs | 5 - .../AddOrganizationDomain.ascx | 30 - .../AddOrganizationDomain.ascx.cs | 54 - .../AddOrganizationDomain.ascx.designer.cs | 96 -- .../AddOrganizationDomain.ascx.resx | 144 --- .../CreateOrganization.ascx.resx | 171 ---- .../DeleteOrganization.ascx.resx | 135 --- .../OrganizationDetails.ascx.resx | 234 ----- .../UpdateOrganizationCatchAll.ascx.resx | 159 --- .../UpdateOrganizationQuotas.ascx.resx | 180 ---- .../UpdateOrganizationServicePlan.ascx.resx | 153 --- .../CreateOrganization.ascx | 73 -- .../CreateOrganization.ascx.cs | 56 -- .../CreateOrganization.ascx.designer.cs | 186 ---- .../DeleteOrganization.ascx | 21 - .../DeleteOrganization.ascx.cs | 54 - .../DeleteOrganization.ascx.designer.cs | 69 -- .../OrganizationDetails.ascx | 166 --- .../OrganizationDetails.ascx.cs | 211 ---- .../OrganizationDetails.ascx.designer.cs | 393 -------- .../UpdateOrganizationCatchAll.ascx | 44 - .../UpdateOrganizationCatchAll.ascx.cs | 108 -- ...pdateOrganizationCatchAll.ascx.designer.cs | 132 --- .../UpdateOrganizationQuotas.ascx | 52 - .../UpdateOrganizationQuotas.ascx.cs | 121 --- .../UpdateOrganizationQuotas.ascx.designer.cs | 195 ---- .../UpdateOrganizationServicePlan.ascx | 58 -- .../UpdateOrganizationServicePlan.ascx.cs | 121 --- ...teOrganizationServicePlan.ascx.designer.cs | 195 ---- ...hangeHostedEditionOrganizationSummary.ascx | 42 - ...geHostedEditionOrganizationSummary.ascx.cs | 67 -- ...ditionOrganizationSummary.ascx.designer.cs | 123 --- .../SettingsExchangeHostedEditionPolicy.ascx | 18 - ...ettingsExchangeHostedEditionPolicy.ascx.cs | 58 -- ...changeHostedEditionPolicy.ascx.designer.cs | 42 - .../WebsitePanel/SpaceSettings.ascx | 3 - .../WebsitePanel/SpaceSettings.ascx.cs | 2 - .../SpaceSettings.ascx.designer.cs | 9 - .../SpaceSettingsExchangeHostedEdition.ascx | 18 - ...SpaceSettingsExchangeHostedEdition.ascx.cs | 63 -- ...ingsExchangeHostedEdition.ascx.designer.cs | 69 -- .../UserAccountMailTemplateSettings.ascx | 4 - ...countMailTemplateSettings.ascx.designer.cs | 9 - .../UserAccountPolicySettings.ascx | 4 - ...UserAccountPolicySettings.ascx.designer.cs | 9 - .../WebsitePanel.Portal.Modules.csproj | 101 -- 78 files changed, 49 insertions(+), 7299 deletions(-) delete mode 100644 WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Client/ExchangeHostedEditionProxy.cs delete mode 100644 WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/ExchangeHostedEdition/ExchangeHostedEditionController.cs delete mode 100644 WebsitePanel/Sources/WebsitePanel.EnterpriseServer/esExchangeHostedEdition.asmx delete mode 100644 WebsitePanel/Sources/WebsitePanel.EnterpriseServer/esExchangeHostedEdition.asmx.cs delete mode 100644 WebsitePanel/Sources/WebsitePanel.Providers.Base/ExchangeHostedEdition/ExchangeOrganization.cs delete mode 100644 WebsitePanel/Sources/WebsitePanel.Providers.Base/ExchangeHostedEdition/ExchangeOrganizationDomain.cs delete mode 100644 WebsitePanel/Sources/WebsitePanel.Providers.Base/ExchangeHostedEdition/IExchangeHostedEdition.cs delete mode 100644 WebsitePanel/Sources/WebsitePanel.Server.Client/ExchangeServerHostedEditionProxy.cs delete mode 100644 WebsitePanel/Sources/WebsitePanel.Server/ExchangeServerHostedEdition.asmx delete mode 100644 WebsitePanel/Sources/WebsitePanel.Server/ExchangeServerHostedEdition.asmx.cs delete mode 100644 WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeHostedEdition/AddOrganizationDomain.ascx delete mode 100644 WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeHostedEdition/AddOrganizationDomain.ascx.cs delete mode 100644 WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeHostedEdition/AddOrganizationDomain.ascx.designer.cs delete mode 100644 WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeHostedEdition/App_LocalResources/AddOrganizationDomain.ascx.resx delete mode 100644 WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeHostedEdition/App_LocalResources/CreateOrganization.ascx.resx delete mode 100644 WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeHostedEdition/App_LocalResources/DeleteOrganization.ascx.resx delete mode 100644 WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeHostedEdition/App_LocalResources/OrganizationDetails.ascx.resx delete mode 100644 WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeHostedEdition/App_LocalResources/UpdateOrganizationCatchAll.ascx.resx delete mode 100644 WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeHostedEdition/App_LocalResources/UpdateOrganizationQuotas.ascx.resx delete mode 100644 WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeHostedEdition/App_LocalResources/UpdateOrganizationServicePlan.ascx.resx delete mode 100644 WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeHostedEdition/CreateOrganization.ascx delete mode 100644 WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeHostedEdition/CreateOrganization.ascx.cs delete mode 100644 WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeHostedEdition/CreateOrganization.ascx.designer.cs delete mode 100644 WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeHostedEdition/DeleteOrganization.ascx delete mode 100644 WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeHostedEdition/DeleteOrganization.ascx.cs delete mode 100644 WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeHostedEdition/DeleteOrganization.ascx.designer.cs delete mode 100644 WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeHostedEdition/OrganizationDetails.ascx delete mode 100644 WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeHostedEdition/OrganizationDetails.ascx.cs delete mode 100644 WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeHostedEdition/OrganizationDetails.ascx.designer.cs delete mode 100644 WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeHostedEdition/UpdateOrganizationCatchAll.ascx delete mode 100644 WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeHostedEdition/UpdateOrganizationCatchAll.ascx.cs delete mode 100644 WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeHostedEdition/UpdateOrganizationCatchAll.ascx.designer.cs delete mode 100644 WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeHostedEdition/UpdateOrganizationQuotas.ascx delete mode 100644 WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeHostedEdition/UpdateOrganizationQuotas.ascx.cs delete mode 100644 WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeHostedEdition/UpdateOrganizationQuotas.ascx.designer.cs delete mode 100644 WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeHostedEdition/UpdateOrganizationServicePlan.ascx delete mode 100644 WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeHostedEdition/UpdateOrganizationServicePlan.ascx.cs delete mode 100644 WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeHostedEdition/UpdateOrganizationServicePlan.ascx.designer.cs delete mode 100644 WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/SettingsExchangeHostedEditionOrganizationSummary.ascx delete mode 100644 WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/SettingsExchangeHostedEditionOrganizationSummary.ascx.cs delete mode 100644 WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/SettingsExchangeHostedEditionOrganizationSummary.ascx.designer.cs delete mode 100644 WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/SettingsExchangeHostedEditionPolicy.ascx delete mode 100644 WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/SettingsExchangeHostedEditionPolicy.ascx.cs delete mode 100644 WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/SettingsExchangeHostedEditionPolicy.ascx.designer.cs delete mode 100644 WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/SpaceSettingsExchangeHostedEdition.ascx delete mode 100644 WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/SpaceSettingsExchangeHostedEdition.ascx.cs delete mode 100644 WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/SpaceSettingsExchangeHostedEdition.ascx.designer.cs diff --git a/WebsitePanel/Database/install_db.sql b/WebsitePanel/Database/install_db.sql index b9a05217..cebc7caf 100644 --- a/WebsitePanel/Database/install_db.sql +++ b/WebsitePanel/Database/install_db.sql @@ -3708,14 +3708,6 @@ INSERT [dbo].[Quotas] ([QuotaID], [GroupID], [QuotaOrder], [QuotaName], [QuotaDe GO INSERT [dbo].[Quotas] ([QuotaID], [GroupID], [QuotaOrder], [QuotaName], [QuotaDescription], [QuotaTypeID], [ServiceQuota], [ItemTypeID]) VALUES (332, 2, 21, N'Web.SSL', N'SSL', 1, 0, NULL) GO -INSERT [dbo].[Quotas] ([QuotaID], [GroupID], [QuotaOrder], [QuotaName], [QuotaDescription], [QuotaTypeID], [ServiceQuota], [ItemTypeID]) VALUES (340, 33, 1, N'ExchangeHostedEdition.Domains', N'Domains', 3, 0, NULL) -GO -INSERT [dbo].[Quotas] ([QuotaID], [GroupID], [QuotaOrder], [QuotaName], [QuotaDescription], [QuotaTypeID], [ServiceQuota], [ItemTypeID]) VALUES (341, 33, 2, N'ExchangeHostedEdition.Mailboxes', N'Mailboxes', 3, 0, NULL) -GO -INSERT [dbo].[Quotas] ([QuotaID], [GroupID], [QuotaOrder], [QuotaName], [QuotaDescription], [QuotaTypeID], [ServiceQuota], [ItemTypeID]) VALUES (342, 33, 3, N'ExchangeHostedEdition.Contacts', N'Contacts', 3, 0, NULL) -GO -INSERT [dbo].[Quotas] ([QuotaID], [GroupID], [QuotaOrder], [QuotaName], [QuotaDescription], [QuotaTypeID], [ServiceQuota], [ItemTypeID]) VALUES (343, 33, 4, N'ExchangeHostedEdition.DistributionLists', N'Distribution Lists', 3, 0, NULL) -GO INSERT [dbo].[Quotas] ([QuotaID], [GroupID], [QuotaOrder], [QuotaName], [QuotaDescription], [QuotaTypeID], [ServiceQuota], [ItemTypeID]) VALUES (344, 2, 9, N'Web.Htaccess', N'htaccess', 1, 0, NULL) GO INSERT [dbo].[Quotas] ([QuotaID], [GroupID], [QuotaOrder], [QuotaName], [QuotaDescription], [QuotaTypeID], [ServiceQuota], [ItemTypeID]) VALUES (345, 40, 1, N'VPSForPC.ServersNumber', N'Number of VPS', 2, 0, 35) @@ -10517,8 +10509,6 @@ INSERT [dbo].[ResourceGroups] ([GroupID], [GroupName], [GroupOrder], [GroupContr GO INSERT [dbo].[ResourceGroups] ([GroupID], [GroupName], [GroupOrder], [GroupController]) VALUES (32, N'OCS', 22, NULL) GO -INSERT [dbo].[ResourceGroups] ([GroupID], [GroupName], [GroupOrder], [GroupController]) VALUES (33, N'ExchangeHostedEdition', 7, N'WebsitePanel.EnterpriseServer.ExchangeHostedEditionController') -GO INSERT [dbo].[ResourceGroups] ([GroupID], [GroupName], [GroupOrder], [GroupController]) VALUES (40, N'VPSForPC', 20, NULL) GO SET ANSI_NULLS ON @@ -22300,8 +22290,6 @@ INSERT [dbo].[ServiceItemTypes] ([ItemTypeID], [GroupID], [DisplayName], [TypeNa GO INSERT [dbo].[ServiceItemTypes] ([ItemTypeID], [GroupID], [DisplayName], [TypeName], [TypeOrder], [CalculateDiskspace], [CalculateBandwidth], [Suspendable], [Disposable], [Searchable], [Importable], [Backupable]) VALUES (38, 23, N'MsSQL2012User', N'WebsitePanel.Providers.Database.SqlUser, WebsitePanel.Providers.Base', 1, 0, 0, 0, 1, 1, 1, 1) GO -INSERT [dbo].[ServiceItemTypes] ([ItemTypeID], [GroupID], [DisplayName], [TypeName], [TypeOrder], [CalculateDiskspace], [CalculateBandwidth], [Suspendable], [Disposable], [Searchable], [Importable], [Backupable]) VALUES (40, 33, N'ExchangeOrganization', N'WebsitePanel.Providers.ExchangeHostedEdition.ExchangeOrganization, WebsitePanel.Providers.Base', 1, 0, 0, 1, 1, 1, 0, 0) -GO INSERT [dbo].[ServiceItemTypes] ([ItemTypeID], [GroupID], [DisplayName], [TypeName], [TypeOrder], [CalculateDiskspace], [CalculateBandwidth], [Suspendable], [Disposable], [Searchable], [Importable], [Backupable]) VALUES (200, 20, N'SharePointSiteCollection', N'WebsitePanel.Providers.SharePoint.SharePointSiteCollection, WebsitePanel.Providers.Base', 25, 1, 0, 0, 1, 1, 1, 1) GO SET ANSI_NULLS ON @@ -23259,8 +23247,6 @@ INSERT [dbo].[Providers] ([ProviderID], [GroupID], [ProviderName], [DisplayName] GO INSERT [dbo].[Providers] ([ProviderID], [GroupID], [ProviderName], [DisplayName], [ProviderType], [EditorControl], [DisableAutoDiscovery]) VALUES (206, 32, N'OCSEdge', N'OCS Edge server', N'WebsitePanel.Providers.HostedSolution.OCSEdge2007R2, WebsitePanel.Providers.HostedSolution', N'OCS_Edge', 1) GO -INSERT [dbo].[Providers] ([ProviderID], [GroupID], [ProviderName], [DisplayName], [ProviderType], [EditorControl], [DisableAutoDiscovery]) VALUES (207, 33, N'Exchange2010SP1', N'Exchange Server 2010 SP1 Hosting Mode', N'WebsitePanel.Providers.ExchangeHostedEdition.Exchange2010SP1, WebsitePanel.Providers.ExchangeHostedEdition', N'Exchange2010SP1', 1) -GO INSERT [dbo].[Providers] ([ProviderID], [GroupID], [ProviderName], [DisplayName], [ProviderType], [EditorControl], [DisableAutoDiscovery]) VALUES (208, 20, N'HostedSharePoint2010', N'Hosted SharePoint Foundation 2010', N'WebsitePanel.Providers.HostedSolution.HostedSharePointServer2010, WebsitePanel.Providers.HostedSolution', N'HostedSharePoint30', NULL) GO INSERT [dbo].[Providers] ([ProviderID], [GroupID], [ProviderName], [DisplayName], [ProviderType], [EditorControl], [DisableAutoDiscovery]) VALUES (209, 23, N'MsSQL', N'Microsoft SQL Server 2012', N'WebsitePanel.Providers.Database.MsSqlServer2012, WebsitePanel.Providers.Database.SqlServer', N'MSSQL', NULL) diff --git a/WebsitePanel/Database/update_db.sql b/WebsitePanel/Database/update_db.sql index ebfc3189..cb5595fa 100644 --- a/WebsitePanel/Database/update_db.sql +++ b/WebsitePanel/Database/update_db.sql @@ -36,37 +36,35 @@ UPDATE [dbo].[ResourceGroups] SET [GroupOrder] = 5 WHERE [GroupName] = N'Exchang GO UPDATE [dbo].[ResourceGroups] SET [GroupOrder] = 6 WHERE [GroupName] = N'Hosted Organizations' GO -UPDATE [dbo].[ResourceGroups] SET [GroupOrder] = 7 WHERE [GroupName] = N'ExchangeHostedEdition' +UPDATE [dbo].[ResourceGroups] SET [GroupOrder] = 7 WHERE [GroupName] = N'MsSQL2000' GO -UPDATE [dbo].[ResourceGroups] SET [GroupOrder] = 8 WHERE [GroupName] = N'MsSQL2000' +UPDATE [dbo].[ResourceGroups] SET [GroupOrder] = 8 WHERE [GroupName] = N'MsSQL2005' GO -UPDATE [dbo].[ResourceGroups] SET [GroupOrder] = 9 WHERE [GroupName] = N'MsSQL2005' +UPDATE [dbo].[ResourceGroups] SET [GroupOrder] = 9 WHERE [GroupName] = N'MsSQL2008' GO -UPDATE [dbo].[ResourceGroups] SET [GroupOrder] = 10 WHERE [GroupName] = N'MsSQL2008' +UPDATE [dbo].[ResourceGroups] SET [GroupOrder] = 10 WHERE [GroupName] = N'MsSQL2012' GO -UPDATE [dbo].[ResourceGroups] SET [GroupOrder] = 11 WHERE [GroupName] = N'MsSQL2012' +UPDATE [dbo].[ResourceGroups] SET [GroupOrder] = 11 WHERE [GroupName] = N'MySQL4' GO -UPDATE [dbo].[ResourceGroups] SET [GroupOrder] = 12 WHERE [GroupName] = N'MySQL4' +UPDATE [dbo].[ResourceGroups] SET [GroupOrder] = 12 WHERE [GroupName] = N'MySQL5' GO -UPDATE [dbo].[ResourceGroups] SET [GroupOrder] = 13 WHERE [GroupName] = N'MySQL5' +UPDATE [dbo].[ResourceGroups] SET [GroupOrder] = 13 WHERE [GroupName] = N'SharePoint' GO -UPDATE [dbo].[ResourceGroups] SET [GroupOrder] = 14 WHERE [GroupName] = N'SharePoint' +UPDATE [dbo].[ResourceGroups] SET [GroupOrder] = 14 WHERE [GroupName] = N'Hosted SharePoint' GO -UPDATE [dbo].[ResourceGroups] SET [GroupOrder] = 15 WHERE [GroupName] = N'Hosted SharePoint' +UPDATE [dbo].[ResourceGroups] SET [GroupOrder] = 15 WHERE [GroupName] = N'Hosted CRM' GO -UPDATE [dbo].[ResourceGroups] SET [GroupOrder] = 16 WHERE [GroupName] = N'Hosted CRM' +UPDATE [dbo].[ResourceGroups] SET [GroupOrder] = 16 WHERE [GroupName] = N'DNS' GO -UPDATE [dbo].[ResourceGroups] SET [GroupOrder] = 17 WHERE [GroupName] = N'DNS' +UPDATE [dbo].[ResourceGroups] SET [GroupOrder] = 17 WHERE [GroupName] = N'Statistics' GO -UPDATE [dbo].[ResourceGroups] SET [GroupOrder] = 18 WHERE [GroupName] = N'Statistics' +UPDATE [dbo].[ResourceGroups] SET [GroupOrder] = 18 WHERE [GroupName] = N'VPS' GO -UPDATE [dbo].[ResourceGroups] SET [GroupOrder] = 19 WHERE [GroupName] = N'VPS' +UPDATE [dbo].[ResourceGroups] SET [GroupOrder] = 19 WHERE [GroupName] = N'VPSForPC' GO -UPDATE [dbo].[ResourceGroups] SET [GroupOrder] = 20 WHERE [GroupName] = N'VPSForPC' +UPDATE [dbo].[ResourceGroups] SET [GroupOrder] = 20 WHERE [GroupName] = N'BlackBerry' GO -UPDATE [dbo].[ResourceGroups] SET [GroupOrder] = 21 WHERE [GroupName] = N'BlackBerry' -GO -UPDATE [dbo].[ResourceGroups] SET [GroupOrder] = 22 WHERE [GroupName] = N'OCS' +UPDATE [dbo].[ResourceGroups] SET [GroupOrder] = 21 WHERE [GroupName] = N'OCS' GO IF NOT EXISTS (SELECT * FROM [dbo].[ServiceItemTypes] WHERE [DisplayName] = 'MsSQL2012Database') @@ -1497,4 +1495,38 @@ GO UPDATE dbo.Quotas SET QuotaTypeID = 2 WHERE QuotaName = 'HostedSharePoint.Sites' +GO + + + + +-- Remove ExchangeHostedEdition Quotas +DELETE FROM Quotas WHERE QuotaID = 340 +GO +DELETE FROM Quotas WHERE QuotaID = 341 +GO +DELETE FROM Quotas WHERE QuotaID = 342 +GO +DELETE FROM Quotas WHERE QuotaID = 343 +GO + + +-- Remove ExchangeHostedEdition ServiceItemType +DELETE FROM ServiceItemTypes WHERE ItemTypeID = 40 +GO + + +-- Remove ExchangeHostedEdition ServiceDefaultProperties +DELETE FROM ServiceDefaultProperties WHERE ProviderID = 207 +GO + + + +-- Remove ExchangeHostedEdition Provider +DELETE FROM Providers WHERE ProviderID = 207 +GO + + +-- Remove ExchangeHostedEdition ResourceGroups +DELETE FROM ResourceGroups WHERE GRoupID = 33 GO \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Base/Packages/PackageSettings.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Base/Packages/PackageSettings.cs index 254bd1af..6d2ba63c 100644 --- a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Base/Packages/PackageSettings.cs +++ b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Base/Packages/PackageSettings.cs @@ -42,7 +42,6 @@ namespace WebsitePanel.EnterpriseServer public const string NAME_SERVERS = "NameServers"; public const string SHARED_SSL_SITES = "SharedSslSites"; public const string EXCHANGE_SERVER = "ExchangeServer"; - public const string EXCHANGE_HOSTED_EDITION = "ExchangeHostedEdition"; public const string HOSTED_SOLLUTION = "HostedSollution"; public const string VIRTUAL_PRIVATE_SERVERS = "VirtualPrivateServers"; diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Base/Packages/Quotas.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Base/Packages/Quotas.cs index 0f353415..98a45a86 100644 --- a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Base/Packages/Quotas.cs +++ b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Base/Packages/Quotas.cs @@ -105,10 +105,6 @@ order by rg.groupOrder public const string EXCHANGE2007_OWAENABLED = "Exchange2007.OWAEnabled"; // OWA Enabled by default public const string EXCHANGE2007_MAPIENABLED = "Exchange2007.MAPIEnabled"; // MAPI Enabled by default public const string EXCHANGE2007_ACTIVESYNCENABLED = "Exchange2007.ActiveSyncEnabled"; // ActiveSync Enabled by default - public const string EXCHANGEHOSTEDEDITION_DOMAINS = "ExchangeHostedEdition.Domains"; - public const string EXCHANGEHOSTEDEDITION_MAILBOXES = "ExchangeHostedEdition.Mailboxes"; - public const string EXCHANGEHOSTEDEDITION_CONTACTS = "ExchangeHostedEdition.Contacts"; - public const string EXCHANGEHOSTEDEDITION_DISTRIBUTIONLISTS = "ExchangeHostedEdition.DistributionLists"; public const string MSSQL2000_DATABASES = "MsSQL2000.Databases"; // Databases public const string MSSQL2000_USERS = "MsSQL2000.Users"; // Users public const string MSSQL2000_MAXDATABASESIZE = "MsSQL2000.MaxDatabaseSize"; // Max Database Size diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Base/Servers/ResourceGroups.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Base/Servers/ResourceGroups.cs index a4813bba..c9ad1502 100644 --- a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Base/Servers/ResourceGroups.cs +++ b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Base/Servers/ResourceGroups.cs @@ -45,7 +45,6 @@ namespace WebsitePanel.EnterpriseServer public const string SharePoint = "SharePoint"; public const string HostedSharePoint = "Hosted SharePoint"; public const string Exchange = "Exchange"; - public const string ExchangeHostedEdition = "ExchangeHostedEdition"; public const string HostedOrganizations = "Hosted Organizations"; public const string HostedCRM = "Hosted CRM"; public const string VPS = "VPS"; diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Base/Users/UserSettings.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Base/Users/UserSettings.cs index 29f3df22..faacf9de 100644 --- a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Base/Users/UserSettings.cs +++ b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Base/Users/UserSettings.cs @@ -41,7 +41,6 @@ namespace WebsitePanel.EnterpriseServer public const string PACKAGE_SUMMARY_LETTER = "PackageSummaryLetter"; public const string PASSWORD_REMINDER_LETTER = "PasswordReminderLetter"; public const string EXCHANGE_MAILBOX_SETUP_LETTER = "ExchangeMailboxSetupLetter"; - public const string EXCHANGE_HOSTED_EDITION_ORGANIZATION_SUMMARY = "ExchangeHostedEditionOrganizationSummary"; public const string HOSTED_SOLUTION_REPORT = "HostedSoluitonReportSummaryLetter"; public const string ORGANIZATION_USER_SUMMARY_LETTER = "OrganizationUserSummaryLetter"; public const string VPS_SUMMARY_LETTER = "VpsSummaryLetter"; @@ -53,7 +52,6 @@ namespace WebsitePanel.EnterpriseServer public const string SHAREPOINT_POLICY = "SharePointPolicy"; public const string OS_POLICY = "OsPolicy"; public const string EXCHANGE_POLICY = "ExchangePolicy"; - public const string EXCHANGE_HOSTED_EDITION_POLICY = "ExchangeHostedEditionPolicy"; public const string WEBSITEPANEL_POLICY = "WebsitePanelPolicy"; public const string VPS_POLICY = "VpsPolicy"; public const string DISPLAY_PREFS = "DisplayPreferences"; diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Client/ExchangeHostedEditionProxy.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Client/ExchangeHostedEditionProxy.cs deleted file mode 100644 index e8b723c4..00000000 --- a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Client/ExchangeHostedEditionProxy.cs +++ /dev/null @@ -1,950 +0,0 @@ -//------------------------------------------------------------------------------ -// -// This code was generated by a tool. -// Runtime Version:2.0.50727.4952 -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -//------------------------------------------------------------------------------ - -// -// This source code was auto-generated by wsdl, Version=2.0.50727.42. -// -namespace WebsitePanel.EnterpriseServer { - using System.Xml.Serialization; - using System.Web.Services; - using System.ComponentModel; - using System.Web.Services.Protocols; - using System; - using System.Diagnostics; - - using WebsitePanel.Providers; - using WebsitePanel.Providers.Common; - using WebsitePanel.Providers.ExchangeHostedEdition; - using WebsitePanel.Providers.ResultObjects; - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] - [System.Diagnostics.DebuggerStepThroughAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - [System.Web.Services.WebServiceBindingAttribute(Name="esExchangeHostedEditionSoap", Namespace="http://smbsaas/websitepanel/enterpriseserver")] - [System.Xml.Serialization.XmlIncludeAttribute(typeof(ServiceProviderItem))] - public partial class esExchangeHostedEdition : Microsoft.Web.Services3.WebServicesClientProtocol { - - private System.Threading.SendOrPostCallback GetOrganizationsOperationCompleted; - - private System.Threading.SendOrPostCallback CreateExchangeOrganizationOperationCompleted; - - private System.Threading.SendOrPostCallback GetExchangeOrganizationDetailsOperationCompleted; - - private System.Threading.SendOrPostCallback GetExchangeOrganizationDomainsOperationCompleted; - - private System.Threading.SendOrPostCallback GetExchangeOrganizationSummaryOperationCompleted; - - private System.Threading.SendOrPostCallback SendExchangeOrganizationSummaryOperationCompleted; - - private System.Threading.SendOrPostCallback AddExchangeOrganizationDomainOperationCompleted; - - private System.Threading.SendOrPostCallback DeleteExchangeOrganizationDomainOperationCompleted; - - private System.Threading.SendOrPostCallback UpdateExchangeOrganizationQuotasOperationCompleted; - - private System.Threading.SendOrPostCallback UpdateExchangeOrganizationCatchAllAddressOperationCompleted; - - private System.Threading.SendOrPostCallback UpdateExchangeOrganizationServicePlanOperationCompleted; - - private System.Threading.SendOrPostCallback DeleteExchangeOrganizationOperationCompleted; - - /// - public esExchangeHostedEdition() { - this.Url = "http://localhost:9002/esExchangeHostedEdition.asmx"; - } - - /// - public event GetOrganizationsCompletedEventHandler GetOrganizationsCompleted; - - /// - public event CreateExchangeOrganizationCompletedEventHandler CreateExchangeOrganizationCompleted; - - /// - public event GetExchangeOrganizationDetailsCompletedEventHandler GetExchangeOrganizationDetailsCompleted; - - /// - public event GetExchangeOrganizationDomainsCompletedEventHandler GetExchangeOrganizationDomainsCompleted; - - /// - public event GetExchangeOrganizationSummaryCompletedEventHandler GetExchangeOrganizationSummaryCompleted; - - /// - public event SendExchangeOrganizationSummaryCompletedEventHandler SendExchangeOrganizationSummaryCompleted; - - /// - public event AddExchangeOrganizationDomainCompletedEventHandler AddExchangeOrganizationDomainCompleted; - - /// - public event DeleteExchangeOrganizationDomainCompletedEventHandler DeleteExchangeOrganizationDomainCompleted; - - /// - public event UpdateExchangeOrganizationQuotasCompletedEventHandler UpdateExchangeOrganizationQuotasCompleted; - - /// - public event UpdateExchangeOrganizationCatchAllAddressCompletedEventHandler UpdateExchangeOrganizationCatchAllAddressCompleted; - - /// - public event UpdateExchangeOrganizationServicePlanCompletedEventHandler UpdateExchangeOrganizationServicePlanCompleted; - - /// - public event DeleteExchangeOrganizationCompletedEventHandler DeleteExchangeOrganizationCompleted; - - /// - [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://smbsaas/websitepanel/enterpriseserver/GetOrganizations", RequestNamespace="http://smbsaas/websitepanel/enterpriseserver", ResponseNamespace="http://smbsaas/websitepanel/enterpriseserver", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] - public ExchangeOrganization[] GetOrganizations(int packageId) { - object[] results = this.Invoke("GetOrganizations", new object[] { - packageId}); - return ((ExchangeOrganization[])(results[0])); - } - - /// - public System.IAsyncResult BeginGetOrganizations(int packageId, System.AsyncCallback callback, object asyncState) { - return this.BeginInvoke("GetOrganizations", new object[] { - packageId}, callback, asyncState); - } - - /// - public ExchangeOrganization[] EndGetOrganizations(System.IAsyncResult asyncResult) { - object[] results = this.EndInvoke(asyncResult); - return ((ExchangeOrganization[])(results[0])); - } - - /// - public void GetOrganizationsAsync(int packageId) { - this.GetOrganizationsAsync(packageId, null); - } - - /// - public void GetOrganizationsAsync(int packageId, object userState) { - if ((this.GetOrganizationsOperationCompleted == null)) { - this.GetOrganizationsOperationCompleted = new System.Threading.SendOrPostCallback(this.OnGetOrganizationsOperationCompleted); - } - this.InvokeAsync("GetOrganizations", new object[] { - packageId}, this.GetOrganizationsOperationCompleted, userState); - } - - private void OnGetOrganizationsOperationCompleted(object arg) { - if ((this.GetOrganizationsCompleted != null)) { - System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); - this.GetOrganizationsCompleted(this, new GetOrganizationsCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); - } - } - - /// - [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://smbsaas/websitepanel/enterpriseserver/CreateExchangeOrganization", RequestNamespace="http://smbsaas/websitepanel/enterpriseserver", ResponseNamespace="http://smbsaas/websitepanel/enterpriseserver", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] - public IntResult CreateExchangeOrganization(int packageId, string organizationId, string domain, string adminName, string adminEmail, string adminPassword) { - object[] results = this.Invoke("CreateExchangeOrganization", new object[] { - packageId, - organizationId, - domain, - adminName, - adminEmail, - adminPassword}); - return ((IntResult)(results[0])); - } - - /// - public System.IAsyncResult BeginCreateExchangeOrganization(int packageId, string organizationId, string domain, string adminName, string adminEmail, string adminPassword, System.AsyncCallback callback, object asyncState) { - return this.BeginInvoke("CreateExchangeOrganization", new object[] { - packageId, - organizationId, - domain, - adminName, - adminEmail, - adminPassword}, callback, asyncState); - } - - /// - public IntResult EndCreateExchangeOrganization(System.IAsyncResult asyncResult) { - object[] results = this.EndInvoke(asyncResult); - return ((IntResult)(results[0])); - } - - /// - public void CreateExchangeOrganizationAsync(int packageId, string organizationId, string domain, string adminName, string adminEmail, string adminPassword) { - this.CreateExchangeOrganizationAsync(packageId, organizationId, domain, adminName, adminEmail, adminPassword, null); - } - - /// - public void CreateExchangeOrganizationAsync(int packageId, string organizationId, string domain, string adminName, string adminEmail, string adminPassword, object userState) { - if ((this.CreateExchangeOrganizationOperationCompleted == null)) { - this.CreateExchangeOrganizationOperationCompleted = new System.Threading.SendOrPostCallback(this.OnCreateExchangeOrganizationOperationCompleted); - } - this.InvokeAsync("CreateExchangeOrganization", new object[] { - packageId, - organizationId, - domain, - adminName, - adminEmail, - adminPassword}, this.CreateExchangeOrganizationOperationCompleted, userState); - } - - private void OnCreateExchangeOrganizationOperationCompleted(object arg) { - if ((this.CreateExchangeOrganizationCompleted != null)) { - System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); - this.CreateExchangeOrganizationCompleted(this, new CreateExchangeOrganizationCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); - } - } - - /// - [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://smbsaas/websitepanel/enterpriseserver/GetExchangeOrganizationDetails", RequestNamespace="http://smbsaas/websitepanel/enterpriseserver", ResponseNamespace="http://smbsaas/websitepanel/enterpriseserver", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] - public ExchangeOrganization GetExchangeOrganizationDetails(int itemId) { - object[] results = this.Invoke("GetExchangeOrganizationDetails", new object[] { - itemId}); - return ((ExchangeOrganization)(results[0])); - } - - /// - public System.IAsyncResult BeginGetExchangeOrganizationDetails(int itemId, System.AsyncCallback callback, object asyncState) { - return this.BeginInvoke("GetExchangeOrganizationDetails", new object[] { - itemId}, callback, asyncState); - } - - /// - public ExchangeOrganization EndGetExchangeOrganizationDetails(System.IAsyncResult asyncResult) { - object[] results = this.EndInvoke(asyncResult); - return ((ExchangeOrganization)(results[0])); - } - - /// - public void GetExchangeOrganizationDetailsAsync(int itemId) { - this.GetExchangeOrganizationDetailsAsync(itemId, null); - } - - /// - public void GetExchangeOrganizationDetailsAsync(int itemId, object userState) { - if ((this.GetExchangeOrganizationDetailsOperationCompleted == null)) { - this.GetExchangeOrganizationDetailsOperationCompleted = new System.Threading.SendOrPostCallback(this.OnGetExchangeOrganizationDetailsOperationCompleted); - } - this.InvokeAsync("GetExchangeOrganizationDetails", new object[] { - itemId}, this.GetExchangeOrganizationDetailsOperationCompleted, userState); - } - - private void OnGetExchangeOrganizationDetailsOperationCompleted(object arg) { - if ((this.GetExchangeOrganizationDetailsCompleted != null)) { - System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); - this.GetExchangeOrganizationDetailsCompleted(this, new GetExchangeOrganizationDetailsCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); - } - } - - /// - [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://smbsaas/websitepanel/enterpriseserver/GetExchangeOrganizationDomains", RequestNamespace="http://smbsaas/websitepanel/enterpriseserver", ResponseNamespace="http://smbsaas/websitepanel/enterpriseserver", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] - public ExchangeOrganizationDomain[] GetExchangeOrganizationDomains(int itemId) { - object[] results = this.Invoke("GetExchangeOrganizationDomains", new object[] { - itemId}); - return ((ExchangeOrganizationDomain[])(results[0])); - } - - /// - public System.IAsyncResult BeginGetExchangeOrganizationDomains(int itemId, System.AsyncCallback callback, object asyncState) { - return this.BeginInvoke("GetExchangeOrganizationDomains", new object[] { - itemId}, callback, asyncState); - } - - /// - public ExchangeOrganizationDomain[] EndGetExchangeOrganizationDomains(System.IAsyncResult asyncResult) { - object[] results = this.EndInvoke(asyncResult); - return ((ExchangeOrganizationDomain[])(results[0])); - } - - /// - public void GetExchangeOrganizationDomainsAsync(int itemId) { - this.GetExchangeOrganizationDomainsAsync(itemId, null); - } - - /// - public void GetExchangeOrganizationDomainsAsync(int itemId, object userState) { - if ((this.GetExchangeOrganizationDomainsOperationCompleted == null)) { - this.GetExchangeOrganizationDomainsOperationCompleted = new System.Threading.SendOrPostCallback(this.OnGetExchangeOrganizationDomainsOperationCompleted); - } - this.InvokeAsync("GetExchangeOrganizationDomains", new object[] { - itemId}, this.GetExchangeOrganizationDomainsOperationCompleted, userState); - } - - private void OnGetExchangeOrganizationDomainsOperationCompleted(object arg) { - if ((this.GetExchangeOrganizationDomainsCompleted != null)) { - System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); - this.GetExchangeOrganizationDomainsCompleted(this, new GetExchangeOrganizationDomainsCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); - } - } - - /// - [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://smbsaas/websitepanel/enterpriseserver/GetExchangeOrganizationSummary", RequestNamespace="http://smbsaas/websitepanel/enterpriseserver", ResponseNamespace="http://smbsaas/websitepanel/enterpriseserver", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] - public string GetExchangeOrganizationSummary(int itemId) { - object[] results = this.Invoke("GetExchangeOrganizationSummary", new object[] { - itemId}); - return ((string)(results[0])); - } - - /// - public System.IAsyncResult BeginGetExchangeOrganizationSummary(int itemId, System.AsyncCallback callback, object asyncState) { - return this.BeginInvoke("GetExchangeOrganizationSummary", new object[] { - itemId}, callback, asyncState); - } - - /// - public string EndGetExchangeOrganizationSummary(System.IAsyncResult asyncResult) { - object[] results = this.EndInvoke(asyncResult); - return ((string)(results[0])); - } - - /// - public void GetExchangeOrganizationSummaryAsync(int itemId) { - this.GetExchangeOrganizationSummaryAsync(itemId, null); - } - - /// - public void GetExchangeOrganizationSummaryAsync(int itemId, object userState) { - if ((this.GetExchangeOrganizationSummaryOperationCompleted == null)) { - this.GetExchangeOrganizationSummaryOperationCompleted = new System.Threading.SendOrPostCallback(this.OnGetExchangeOrganizationSummaryOperationCompleted); - } - this.InvokeAsync("GetExchangeOrganizationSummary", new object[] { - itemId}, this.GetExchangeOrganizationSummaryOperationCompleted, userState); - } - - private void OnGetExchangeOrganizationSummaryOperationCompleted(object arg) { - if ((this.GetExchangeOrganizationSummaryCompleted != null)) { - System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); - this.GetExchangeOrganizationSummaryCompleted(this, new GetExchangeOrganizationSummaryCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); - } - } - - /// - [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://smbsaas/websitepanel/enterpriseserver/SendExchangeOrganizationSummary", RequestNamespace="http://smbsaas/websitepanel/enterpriseserver", ResponseNamespace="http://smbsaas/websitepanel/enterpriseserver", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] - public ResultObject SendExchangeOrganizationSummary(int itemId, string toEmail) { - object[] results = this.Invoke("SendExchangeOrganizationSummary", new object[] { - itemId, - toEmail}); - return ((ResultObject)(results[0])); - } - - /// - public System.IAsyncResult BeginSendExchangeOrganizationSummary(int itemId, string toEmail, System.AsyncCallback callback, object asyncState) { - return this.BeginInvoke("SendExchangeOrganizationSummary", new object[] { - itemId, - toEmail}, callback, asyncState); - } - - /// - public ResultObject EndSendExchangeOrganizationSummary(System.IAsyncResult asyncResult) { - object[] results = this.EndInvoke(asyncResult); - return ((ResultObject)(results[0])); - } - - /// - public void SendExchangeOrganizationSummaryAsync(int itemId, string toEmail) { - this.SendExchangeOrganizationSummaryAsync(itemId, toEmail, null); - } - - /// - public void SendExchangeOrganizationSummaryAsync(int itemId, string toEmail, object userState) { - if ((this.SendExchangeOrganizationSummaryOperationCompleted == null)) { - this.SendExchangeOrganizationSummaryOperationCompleted = new System.Threading.SendOrPostCallback(this.OnSendExchangeOrganizationSummaryOperationCompleted); - } - this.InvokeAsync("SendExchangeOrganizationSummary", new object[] { - itemId, - toEmail}, this.SendExchangeOrganizationSummaryOperationCompleted, userState); - } - - private void OnSendExchangeOrganizationSummaryOperationCompleted(object arg) { - if ((this.SendExchangeOrganizationSummaryCompleted != null)) { - System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); - this.SendExchangeOrganizationSummaryCompleted(this, new SendExchangeOrganizationSummaryCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); - } - } - - /// - [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://smbsaas/websitepanel/enterpriseserver/AddExchangeOrganizationDomain", RequestNamespace="http://smbsaas/websitepanel/enterpriseserver", ResponseNamespace="http://smbsaas/websitepanel/enterpriseserver", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] - public ResultObject AddExchangeOrganizationDomain(int itemId, string domain) { - object[] results = this.Invoke("AddExchangeOrganizationDomain", new object[] { - itemId, - domain}); - return ((ResultObject)(results[0])); - } - - /// - public System.IAsyncResult BeginAddExchangeOrganizationDomain(int itemId, string domain, System.AsyncCallback callback, object asyncState) { - return this.BeginInvoke("AddExchangeOrganizationDomain", new object[] { - itemId, - domain}, callback, asyncState); - } - - /// - public ResultObject EndAddExchangeOrganizationDomain(System.IAsyncResult asyncResult) { - object[] results = this.EndInvoke(asyncResult); - return ((ResultObject)(results[0])); - } - - /// - public void AddExchangeOrganizationDomainAsync(int itemId, string domain) { - this.AddExchangeOrganizationDomainAsync(itemId, domain, null); - } - - /// - public void AddExchangeOrganizationDomainAsync(int itemId, string domain, object userState) { - if ((this.AddExchangeOrganizationDomainOperationCompleted == null)) { - this.AddExchangeOrganizationDomainOperationCompleted = new System.Threading.SendOrPostCallback(this.OnAddExchangeOrganizationDomainOperationCompleted); - } - this.InvokeAsync("AddExchangeOrganizationDomain", new object[] { - itemId, - domain}, this.AddExchangeOrganizationDomainOperationCompleted, userState); - } - - private void OnAddExchangeOrganizationDomainOperationCompleted(object arg) { - if ((this.AddExchangeOrganizationDomainCompleted != null)) { - System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); - this.AddExchangeOrganizationDomainCompleted(this, new AddExchangeOrganizationDomainCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); - } - } - - /// - [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://smbsaas/websitepanel/enterpriseserver/DeleteExchangeOrganizationDomain", RequestNamespace="http://smbsaas/websitepanel/enterpriseserver", ResponseNamespace="http://smbsaas/websitepanel/enterpriseserver", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] - public ResultObject DeleteExchangeOrganizationDomain(int itemId, string domain) { - object[] results = this.Invoke("DeleteExchangeOrganizationDomain", new object[] { - itemId, - domain}); - return ((ResultObject)(results[0])); - } - - /// - public System.IAsyncResult BeginDeleteExchangeOrganizationDomain(int itemId, string domain, System.AsyncCallback callback, object asyncState) { - return this.BeginInvoke("DeleteExchangeOrganizationDomain", new object[] { - itemId, - domain}, callback, asyncState); - } - - /// - public ResultObject EndDeleteExchangeOrganizationDomain(System.IAsyncResult asyncResult) { - object[] results = this.EndInvoke(asyncResult); - return ((ResultObject)(results[0])); - } - - /// - public void DeleteExchangeOrganizationDomainAsync(int itemId, string domain) { - this.DeleteExchangeOrganizationDomainAsync(itemId, domain, null); - } - - /// - public void DeleteExchangeOrganizationDomainAsync(int itemId, string domain, object userState) { - if ((this.DeleteExchangeOrganizationDomainOperationCompleted == null)) { - this.DeleteExchangeOrganizationDomainOperationCompleted = new System.Threading.SendOrPostCallback(this.OnDeleteExchangeOrganizationDomainOperationCompleted); - } - this.InvokeAsync("DeleteExchangeOrganizationDomain", new object[] { - itemId, - domain}, this.DeleteExchangeOrganizationDomainOperationCompleted, userState); - } - - private void OnDeleteExchangeOrganizationDomainOperationCompleted(object arg) { - if ((this.DeleteExchangeOrganizationDomainCompleted != null)) { - System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); - this.DeleteExchangeOrganizationDomainCompleted(this, new DeleteExchangeOrganizationDomainCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); - } - } - - /// - [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://smbsaas/websitepanel/enterpriseserver/UpdateExchangeOrganizationQuotas", RequestNamespace="http://smbsaas/websitepanel/enterpriseserver", ResponseNamespace="http://smbsaas/websitepanel/enterpriseserver", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] - public ResultObject UpdateExchangeOrganizationQuotas(int itemId, int mailboxesNumber, int contactsNumber, int distributionListsNumber) { - object[] results = this.Invoke("UpdateExchangeOrganizationQuotas", new object[] { - itemId, - mailboxesNumber, - contactsNumber, - distributionListsNumber}); - return ((ResultObject)(results[0])); - } - - /// - public System.IAsyncResult BeginUpdateExchangeOrganizationQuotas(int itemId, int mailboxesNumber, int contactsNumber, int distributionListsNumber, System.AsyncCallback callback, object asyncState) { - return this.BeginInvoke("UpdateExchangeOrganizationQuotas", new object[] { - itemId, - mailboxesNumber, - contactsNumber, - distributionListsNumber}, callback, asyncState); - } - - /// - public ResultObject EndUpdateExchangeOrganizationQuotas(System.IAsyncResult asyncResult) { - object[] results = this.EndInvoke(asyncResult); - return ((ResultObject)(results[0])); - } - - /// - public void UpdateExchangeOrganizationQuotasAsync(int itemId, int mailboxesNumber, int contactsNumber, int distributionListsNumber) { - this.UpdateExchangeOrganizationQuotasAsync(itemId, mailboxesNumber, contactsNumber, distributionListsNumber, null); - } - - /// - public void UpdateExchangeOrganizationQuotasAsync(int itemId, int mailboxesNumber, int contactsNumber, int distributionListsNumber, object userState) { - if ((this.UpdateExchangeOrganizationQuotasOperationCompleted == null)) { - this.UpdateExchangeOrganizationQuotasOperationCompleted = new System.Threading.SendOrPostCallback(this.OnUpdateExchangeOrganizationQuotasOperationCompleted); - } - this.InvokeAsync("UpdateExchangeOrganizationQuotas", new object[] { - itemId, - mailboxesNumber, - contactsNumber, - distributionListsNumber}, this.UpdateExchangeOrganizationQuotasOperationCompleted, userState); - } - - private void OnUpdateExchangeOrganizationQuotasOperationCompleted(object arg) { - if ((this.UpdateExchangeOrganizationQuotasCompleted != null)) { - System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); - this.UpdateExchangeOrganizationQuotasCompleted(this, new UpdateExchangeOrganizationQuotasCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); - } - } - - /// - [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://smbsaas/websitepanel/enterpriseserver/UpdateExchangeOrganizationCatchAllAd" + - "dress", RequestNamespace="http://smbsaas/websitepanel/enterpriseserver", ResponseNamespace="http://smbsaas/websitepanel/enterpriseserver", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] - public ResultObject UpdateExchangeOrganizationCatchAllAddress(int itemId, string catchAllEmail) { - object[] results = this.Invoke("UpdateExchangeOrganizationCatchAllAddress", new object[] { - itemId, - catchAllEmail}); - return ((ResultObject)(results[0])); - } - - /// - public System.IAsyncResult BeginUpdateExchangeOrganizationCatchAllAddress(int itemId, string catchAllEmail, System.AsyncCallback callback, object asyncState) { - return this.BeginInvoke("UpdateExchangeOrganizationCatchAllAddress", new object[] { - itemId, - catchAllEmail}, callback, asyncState); - } - - /// - public ResultObject EndUpdateExchangeOrganizationCatchAllAddress(System.IAsyncResult asyncResult) { - object[] results = this.EndInvoke(asyncResult); - return ((ResultObject)(results[0])); - } - - /// - public void UpdateExchangeOrganizationCatchAllAddressAsync(int itemId, string catchAllEmail) { - this.UpdateExchangeOrganizationCatchAllAddressAsync(itemId, catchAllEmail, null); - } - - /// - public void UpdateExchangeOrganizationCatchAllAddressAsync(int itemId, string catchAllEmail, object userState) { - if ((this.UpdateExchangeOrganizationCatchAllAddressOperationCompleted == null)) { - this.UpdateExchangeOrganizationCatchAllAddressOperationCompleted = new System.Threading.SendOrPostCallback(this.OnUpdateExchangeOrganizationCatchAllAddressOperationCompleted); - } - this.InvokeAsync("UpdateExchangeOrganizationCatchAllAddress", new object[] { - itemId, - catchAllEmail}, this.UpdateExchangeOrganizationCatchAllAddressOperationCompleted, userState); - } - - private void OnUpdateExchangeOrganizationCatchAllAddressOperationCompleted(object arg) { - if ((this.UpdateExchangeOrganizationCatchAllAddressCompleted != null)) { - System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); - this.UpdateExchangeOrganizationCatchAllAddressCompleted(this, new UpdateExchangeOrganizationCatchAllAddressCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); - } - } - - /// - [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://smbsaas/websitepanel/enterpriseserver/UpdateExchangeOrganizationServicePla" + - "n", RequestNamespace="http://smbsaas/websitepanel/enterpriseserver", ResponseNamespace="http://smbsaas/websitepanel/enterpriseserver", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] - public ResultObject UpdateExchangeOrganizationServicePlan(int itemId, int newServiceId) { - object[] results = this.Invoke("UpdateExchangeOrganizationServicePlan", new object[] { - itemId, - newServiceId}); - return ((ResultObject)(results[0])); - } - - /// - public System.IAsyncResult BeginUpdateExchangeOrganizationServicePlan(int itemId, int newServiceId, System.AsyncCallback callback, object asyncState) { - return this.BeginInvoke("UpdateExchangeOrganizationServicePlan", new object[] { - itemId, - newServiceId}, callback, asyncState); - } - - /// - public ResultObject EndUpdateExchangeOrganizationServicePlan(System.IAsyncResult asyncResult) { - object[] results = this.EndInvoke(asyncResult); - return ((ResultObject)(results[0])); - } - - /// - public void UpdateExchangeOrganizationServicePlanAsync(int itemId, int newServiceId) { - this.UpdateExchangeOrganizationServicePlanAsync(itemId, newServiceId, null); - } - - /// - public void UpdateExchangeOrganizationServicePlanAsync(int itemId, int newServiceId, object userState) { - if ((this.UpdateExchangeOrganizationServicePlanOperationCompleted == null)) { - this.UpdateExchangeOrganizationServicePlanOperationCompleted = new System.Threading.SendOrPostCallback(this.OnUpdateExchangeOrganizationServicePlanOperationCompleted); - } - this.InvokeAsync("UpdateExchangeOrganizationServicePlan", new object[] { - itemId, - newServiceId}, this.UpdateExchangeOrganizationServicePlanOperationCompleted, userState); - } - - private void OnUpdateExchangeOrganizationServicePlanOperationCompleted(object arg) { - if ((this.UpdateExchangeOrganizationServicePlanCompleted != null)) { - System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); - this.UpdateExchangeOrganizationServicePlanCompleted(this, new UpdateExchangeOrganizationServicePlanCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); - } - } - - /// - [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://smbsaas/websitepanel/enterpriseserver/DeleteExchangeOrganization", RequestNamespace="http://smbsaas/websitepanel/enterpriseserver", ResponseNamespace="http://smbsaas/websitepanel/enterpriseserver", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] - public ResultObject DeleteExchangeOrganization(int itemId) { - object[] results = this.Invoke("DeleteExchangeOrganization", new object[] { - itemId}); - return ((ResultObject)(results[0])); - } - - /// - public System.IAsyncResult BeginDeleteExchangeOrganization(int itemId, System.AsyncCallback callback, object asyncState) { - return this.BeginInvoke("DeleteExchangeOrganization", new object[] { - itemId}, callback, asyncState); - } - - /// - public ResultObject EndDeleteExchangeOrganization(System.IAsyncResult asyncResult) { - object[] results = this.EndInvoke(asyncResult); - return ((ResultObject)(results[0])); - } - - /// - public void DeleteExchangeOrganizationAsync(int itemId) { - this.DeleteExchangeOrganizationAsync(itemId, null); - } - - /// - public void DeleteExchangeOrganizationAsync(int itemId, object userState) { - if ((this.DeleteExchangeOrganizationOperationCompleted == null)) { - this.DeleteExchangeOrganizationOperationCompleted = new System.Threading.SendOrPostCallback(this.OnDeleteExchangeOrganizationOperationCompleted); - } - this.InvokeAsync("DeleteExchangeOrganization", new object[] { - itemId}, this.DeleteExchangeOrganizationOperationCompleted, userState); - } - - private void OnDeleteExchangeOrganizationOperationCompleted(object arg) { - if ((this.DeleteExchangeOrganizationCompleted != null)) { - System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); - this.DeleteExchangeOrganizationCompleted(this, new DeleteExchangeOrganizationCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); - } - } - - /// - public new void CancelAsync(object userState) { - base.CancelAsync(userState); - } - } - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] - public delegate void GetOrganizationsCompletedEventHandler(object sender, GetOrganizationsCompletedEventArgs e); - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] - [System.Diagnostics.DebuggerStepThroughAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - public partial class GetOrganizationsCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { - - private object[] results; - - internal GetOrganizationsCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : - base(exception, cancelled, userState) { - this.results = results; - } - - /// - public ExchangeOrganization[] Result { - get { - this.RaiseExceptionIfNecessary(); - return ((ExchangeOrganization[])(this.results[0])); - } - } - } - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] - public delegate void CreateExchangeOrganizationCompletedEventHandler(object sender, CreateExchangeOrganizationCompletedEventArgs e); - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] - [System.Diagnostics.DebuggerStepThroughAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - public partial class CreateExchangeOrganizationCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { - - private object[] results; - - internal CreateExchangeOrganizationCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : - base(exception, cancelled, userState) { - this.results = results; - } - - /// - public IntResult Result { - get { - this.RaiseExceptionIfNecessary(); - return ((IntResult)(this.results[0])); - } - } - } - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] - public delegate void GetExchangeOrganizationDetailsCompletedEventHandler(object sender, GetExchangeOrganizationDetailsCompletedEventArgs e); - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] - [System.Diagnostics.DebuggerStepThroughAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - public partial class GetExchangeOrganizationDetailsCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { - - private object[] results; - - internal GetExchangeOrganizationDetailsCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : - base(exception, cancelled, userState) { - this.results = results; - } - - /// - public ExchangeOrganization Result { - get { - this.RaiseExceptionIfNecessary(); - return ((ExchangeOrganization)(this.results[0])); - } - } - } - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] - public delegate void GetExchangeOrganizationDomainsCompletedEventHandler(object sender, GetExchangeOrganizationDomainsCompletedEventArgs e); - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] - [System.Diagnostics.DebuggerStepThroughAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - public partial class GetExchangeOrganizationDomainsCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { - - private object[] results; - - internal GetExchangeOrganizationDomainsCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : - base(exception, cancelled, userState) { - this.results = results; - } - - /// - public ExchangeOrganizationDomain[] Result { - get { - this.RaiseExceptionIfNecessary(); - return ((ExchangeOrganizationDomain[])(this.results[0])); - } - } - } - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] - public delegate void GetExchangeOrganizationSummaryCompletedEventHandler(object sender, GetExchangeOrganizationSummaryCompletedEventArgs e); - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] - [System.Diagnostics.DebuggerStepThroughAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - public partial class GetExchangeOrganizationSummaryCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { - - private object[] results; - - internal GetExchangeOrganizationSummaryCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : - base(exception, cancelled, userState) { - this.results = results; - } - - /// - public string Result { - get { - this.RaiseExceptionIfNecessary(); - return ((string)(this.results[0])); - } - } - } - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] - public delegate void SendExchangeOrganizationSummaryCompletedEventHandler(object sender, SendExchangeOrganizationSummaryCompletedEventArgs e); - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] - [System.Diagnostics.DebuggerStepThroughAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - public partial class SendExchangeOrganizationSummaryCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { - - private object[] results; - - internal SendExchangeOrganizationSummaryCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : - base(exception, cancelled, userState) { - this.results = results; - } - - /// - public ResultObject Result { - get { - this.RaiseExceptionIfNecessary(); - return ((ResultObject)(this.results[0])); - } - } - } - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] - public delegate void AddExchangeOrganizationDomainCompletedEventHandler(object sender, AddExchangeOrganizationDomainCompletedEventArgs e); - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] - [System.Diagnostics.DebuggerStepThroughAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - public partial class AddExchangeOrganizationDomainCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { - - private object[] results; - - internal AddExchangeOrganizationDomainCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : - base(exception, cancelled, userState) { - this.results = results; - } - - /// - public ResultObject Result { - get { - this.RaiseExceptionIfNecessary(); - return ((ResultObject)(this.results[0])); - } - } - } - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] - public delegate void DeleteExchangeOrganizationDomainCompletedEventHandler(object sender, DeleteExchangeOrganizationDomainCompletedEventArgs e); - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] - [System.Diagnostics.DebuggerStepThroughAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - public partial class DeleteExchangeOrganizationDomainCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { - - private object[] results; - - internal DeleteExchangeOrganizationDomainCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : - base(exception, cancelled, userState) { - this.results = results; - } - - /// - public ResultObject Result { - get { - this.RaiseExceptionIfNecessary(); - return ((ResultObject)(this.results[0])); - } - } - } - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] - public delegate void UpdateExchangeOrganizationQuotasCompletedEventHandler(object sender, UpdateExchangeOrganizationQuotasCompletedEventArgs e); - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] - [System.Diagnostics.DebuggerStepThroughAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - public partial class UpdateExchangeOrganizationQuotasCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { - - private object[] results; - - internal UpdateExchangeOrganizationQuotasCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : - base(exception, cancelled, userState) { - this.results = results; - } - - /// - public ResultObject Result { - get { - this.RaiseExceptionIfNecessary(); - return ((ResultObject)(this.results[0])); - } - } - } - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] - public delegate void UpdateExchangeOrganizationCatchAllAddressCompletedEventHandler(object sender, UpdateExchangeOrganizationCatchAllAddressCompletedEventArgs e); - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] - [System.Diagnostics.DebuggerStepThroughAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - public partial class UpdateExchangeOrganizationCatchAllAddressCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { - - private object[] results; - - internal UpdateExchangeOrganizationCatchAllAddressCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : - base(exception, cancelled, userState) { - this.results = results; - } - - /// - public ResultObject Result { - get { - this.RaiseExceptionIfNecessary(); - return ((ResultObject)(this.results[0])); - } - } - } - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] - public delegate void UpdateExchangeOrganizationServicePlanCompletedEventHandler(object sender, UpdateExchangeOrganizationServicePlanCompletedEventArgs e); - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] - [System.Diagnostics.DebuggerStepThroughAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - public partial class UpdateExchangeOrganizationServicePlanCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { - - private object[] results; - - internal UpdateExchangeOrganizationServicePlanCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : - base(exception, cancelled, userState) { - this.results = results; - } - - /// - public ResultObject Result { - get { - this.RaiseExceptionIfNecessary(); - return ((ResultObject)(this.results[0])); - } - } - } - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] - public delegate void DeleteExchangeOrganizationCompletedEventHandler(object sender, DeleteExchangeOrganizationCompletedEventArgs e); - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] - [System.Diagnostics.DebuggerStepThroughAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - public partial class DeleteExchangeOrganizationCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { - - private object[] results; - - internal DeleteExchangeOrganizationCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : - base(exception, cancelled, userState) { - this.results = results; - } - - /// - public ResultObject Result { - get { - this.RaiseExceptionIfNecessary(); - return ((ResultObject)(this.results[0])); - } - } - } -} diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Client/WebsitePanel.EnterpriseServer.Client.csproj b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Client/WebsitePanel.EnterpriseServer.Client.csproj index 57eb796c..dfd4d020 100644 --- a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Client/WebsitePanel.EnterpriseServer.Client.csproj +++ b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Client/WebsitePanel.EnterpriseServer.Client.csproj @@ -93,7 +93,6 @@ - diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/ExchangeHostedEdition/ExchangeHostedEditionController.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/ExchangeHostedEdition/ExchangeHostedEditionController.cs deleted file mode 100644 index 0fb1f80f..00000000 --- a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/ExchangeHostedEdition/ExchangeHostedEditionController.cs +++ /dev/null @@ -1,896 +0,0 @@ -// Copyright (c) 2012, Outercurve Foundation. -// All rights reserved. -// -// Redistribution and use in source and binary forms, with or without modification, -// are permitted provided that the following conditions are met: -// -// - Redistributions of source code must retain the above copyright notice, this -// list of conditions and the following disclaimer. -// -// - Redistributions in binary form must reproduce the above copyright notice, -// this list of conditions and the following disclaimer in the documentation -// and/or other materials provided with the distribution. -// -// - Neither the name of the Outercurve Foundation nor the names of its -// contributors may be used to endorse or promote products derived from this -// software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR -// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON -// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -using System; -using System.Collections.Generic; -using System.Web; -using WebsitePanel.Providers.ExchangeHostedEdition; -using WebsitePanel.Providers.ResultObjects; -using WebsitePanel.Providers.Common; -using WebsitePanel.Providers; -using System.Collections.Specialized; -using System.Collections; -using System.Net.Mail; - -namespace WebsitePanel.EnterpriseServer -{ - public class ExchangeHostedEditionController - { - // messages - public const string GeneralError = "GeneralError"; - public const string ExchangeServiceNotEnabledError = "ExchangeServiceNotEnabledError"; - public const string ProgramIdIsNotSetError = "ProgramIdIsNotSetError"; - public const string OfferIdIsNotSetError = "OfferIdIsNotSetError"; - public const string CreateOrganizationError = "CreateOrganizationError"; - public const string OrganizationNotFoundError = "OrganizationNotFoundError"; - public const string SendOrganizationSummaryError = "SendOrganizationSummaryError"; - public const string SendOrganizationTemplateNotSetError = "SendOrganizationTemplateNotSetError"; - public const string AddDomainError = "AddDomainError"; - public const string AddDomainQuotaExceededError = "AddDomainQuotaExceededError"; - public const string AddDomainExistsError = "AddDomainExistsError"; - public const string AddDomainAlreadyUsedError = "AddDomainAlreadyUsedError"; - public const string DeleteDomainError = "DeleteDomainError"; - public const string UpdateQuotasError = "UpdateQuotasError"; - public const string UpdateQuotasWrongQuotaError = "UpdateQuotasWrongQuotaError"; - public const string UpdateCatchAllError = "UpdateCatchAllError"; - public const string UpdateServicePlanError = "UpdateServicePlanError"; - public const string DeleteOrganizationError = "DeleteOrganizationError"; - - public const string TempDomainSetting = "temporaryDomain"; - public const string ExchangeControlPanelUrlSetting = "ecpURL"; - - // other constants - public const string TaskManagerSource = "ExchangeHostedEdition"; - - public static IntResult CreateOrganization(int packageId, string organizationId, - string domain, string adminName, string adminEmail, string adminPassword) - { - IntResult result = new IntResult(); - result.IsSuccess = true; - - try - { - // initialize task manager - TaskManager.StartTask(TaskManagerSource, "CREATE_ORGANIZATION"); - TaskManager.WriteParameter("packageId", packageId); - TaskManager.WriteParameter("organizationId", organizationId); - TaskManager.WriteParameter("domain", domain); - TaskManager.WriteParameter("adminName", adminName); - TaskManager.WriteParameter("adminEmail", adminEmail); - TaskManager.WriteParameter("adminPassword", adminPassword); - - // get Exchange service ID - int serviceId = PackageController.GetPackageServiceId(packageId, ResourceGroups.ExchangeHostedEdition); - if(serviceId < 1) - return Error(ExchangeServiceNotEnabledError); - - #region Check Space and Account - // Check account - int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo | DemandAccount.IsActive); - if (accountCheck < 0) - return Warning((-accountCheck).ToString()); - - // Check space - int packageCheck = SecurityContext.CheckPackage(packageId, DemandPackage.IsActive); - if (packageCheck < 0) - return Warning((-packageCheck).ToString()); - #endregion - - // get Exchange service - ExchangeServerHostedEdition exchange = GetExchangeService(serviceId); - - // load service settings to know ProgramID, OfferID - StringDictionary serviceSettings = ServerController.GetServiceSettings(serviceId); - string programId = serviceSettings["programID"]; - string offerId = serviceSettings["offerID"]; - - // check settings - if(String.IsNullOrEmpty(programId)) - result.ErrorCodes.Add(ProgramIdIsNotSetError); - if (String.IsNullOrEmpty(offerId)) - result.ErrorCodes.Add(OfferIdIsNotSetError); - - if (result.ErrorCodes.Count > 0) - { - result.IsSuccess = false; - return result; - } - - #region Create organization - int itemId = -1; - ExchangeOrganization org = null; - try - { - // create organization - exchange.CreateOrganization(organizationId, programId, offerId, domain, adminName, adminEmail, adminPassword); - - // save item into meta-base - org = new ExchangeOrganization(); - org.Name = organizationId; - org.PackageId = packageId; - org.ServiceId = serviceId; - itemId = PackageController.AddPackageItem(org); - } - catch (Exception ex) - { - // log error - TaskManager.WriteError(ex); - return Error(CreateOrganizationError); - } - #endregion - - #region Update organization quotas - // update max org quotas - UpdateOrganizationQuotas(org); - - // override quotas - ResultObject quotasResult = ExchangeHostedEditionController.UpdateOrganizationQuotas(itemId, - org.MaxMailboxCountQuota, - org.MaxContactCountQuota, - org.MaxDistributionListCountQuota); - - if (!quotasResult.IsSuccess) - return Error(quotasResult, CreateOrganizationError); - #endregion - - #region Add temporary domain - // load settings - PackageSettings settings = GetExchangePackageSettings(org); - string tempDomainTemplate = settings[TempDomainSetting]; - if (!String.IsNullOrEmpty(tempDomainTemplate)) - { - // add temp domain - string tempDomain = String.Format("{0}.{1}", domain, tempDomainTemplate); - AddOrganizationDomain(itemId, tempDomain); - } - - #endregion - - result.Value = itemId; - return result; - } - catch (Exception ex) - { - // log error - TaskManager.WriteError(ex); - - // exit with error code - return Error(GeneralError, ex.Message); - } - finally - { - TaskManager.CompleteTask(); - } - } - - public static List GetOrganizations(int packageId) - { - List items = PackageController.GetPackageItemsByType( - packageId, typeof(ExchangeOrganization), false); - - return items.ConvertAll(i => { return (ExchangeOrganization)i; }); - } - - public static ExchangeOrganization GetOrganizationDetails(int itemId) - { - // load organization item - ExchangeOrganization item = PackageController.GetPackageItem(itemId) as ExchangeOrganization; - if (item == null) - return null; // organization item not found - - // get Exchange service - ExchangeServerHostedEdition exchange = GetExchangeService(item.ServiceId); - - // get organization details - ExchangeOrganization org = exchange.GetOrganizationDetails(item.Name); - - //ExchangeOrganization org = new ExchangeOrganization - //{ - // Id = item.Id, - // PackageId = item.PackageId, - // ServiceId = item.ServiceId, - // Name = item.Name, - // AdministratorEmail = "admin@email.com", - // AdministratorName = "Administrator Mailbox", - // CatchAllAddress = "", - // ContactCount = 1, - // ContactCountQuota = 2, - // MaxContactCountQuota = 3, - // DistinguishedName = "DN=....", - // DistributionListCount = 2, - // DistributionListCountQuota = 3, - // MaxDistributionListCountQuota = 3, - // MaxDomainsCountQuota = 4, - // ExchangeControlPanelUrl = "http://ecp.domain.com", - // MailboxCount = 3, - // MailboxCountQuota = 4, - // MaxMailboxCountQuota = 4, - // ProgramId = "HostedExchange", - // OfferId = "2", - // ServicePlan = "HostedExchange_Basic", - // Domains = GetOrganizationDomains(item.Id).ToArray() - //}; - - // update item props - org.Id = item.Id; - org.PackageId = item.PackageId; - org.ServiceId = item.ServiceId; - org.Name = item.Name; - org.CatchAllAddress = item.CatchAllAddress; - - // update max quotas - UpdateOrganizationQuotas(org); - - // process summary information - org.SummaryInformation = GetExchangeOrganizationSummary(org); - - // process domains - PackageSettings settings = GetExchangePackageSettings(org); - if(settings != null) - { - // get settings - string tempDomain = settings[TempDomainSetting]; - string ecpUrl = settings[ExchangeControlPanelUrlSetting]; - - // iterate through domains - foreach (ExchangeOrganizationDomain domain in org.Domains) - { - if (tempDomain != null && domain.Name.EndsWith("." + tempDomain, StringComparison.InvariantCultureIgnoreCase)) - domain.IsTemp = true; - if (domain.IsDefault && ecpUrl != null) - org.ExchangeControlPanelUrl = Utils.ReplaceStringVariable(ecpUrl, "domain_name", domain.Name); - } - } - - // return org - return org; - } - - public static void UpdateOrganizationQuotas(ExchangeOrganization org) - { - // load default package quotas - PackageContext cntx = PackageController.GetPackageContext(org.PackageId); - if (!cntx.Groups.ContainsKey(ResourceGroups.ExchangeHostedEdition)) - return; - - org.MaxMailboxCountQuota = cntx.Quotas[Quotas.EXCHANGEHOSTEDEDITION_MAILBOXES].QuotaAllocatedValue; - org.MaxContactCountQuota = cntx.Quotas[Quotas.EXCHANGEHOSTEDEDITION_CONTACTS].QuotaAllocatedValue; - org.MaxDistributionListCountQuota = cntx.Quotas[Quotas.EXCHANGEHOSTEDEDITION_DISTRIBUTIONLISTS].QuotaAllocatedValue; - org.MaxDomainsCountQuota = cntx.Quotas[Quotas.EXCHANGEHOSTEDEDITION_DOMAINS].QuotaAllocatedValue; - } - - public static List GetOrganizationDomains(int itemId) - { - // load organization item - ExchangeOrganization item = PackageController.GetPackageItem(itemId) as ExchangeOrganization; - if (item == null) - return null; // organization item not found - - // get Exchange service - ExchangeServerHostedEdition exchange = GetExchangeService(item.ServiceId); - - // get organization domains - List domains = new List(); - domains.AddRange(exchange.GetOrganizationDomains(item.Name)); - return domains; - - //return new List - //{ - // new ExchangeOrganizationDomain { Identity = "org101\\domain1.com", Name = "domain1.com", IsDefault = true, IsTemp = false }, - // new ExchangeOrganizationDomain { Identity = "org101\\org101.tempdomain.com", Name = "org101.tempdomain.com", IsDefault = false, IsTemp = true }, - // new ExchangeOrganizationDomain { Identity = "org101\\myseconddomain.com", Name = "myseconddomain.com", IsDefault = false, IsTemp = false } - //}; - } - - public static string GetExchangeOrganizationSummary(int itemId) - { - // load organization details - ExchangeOrganization org = GetOrganizationDetails(itemId); - if (org == null) - return null; // organization not found - - return GetExchangeOrganizationSummary(org); - } - - private static string GetExchangeOrganizationSummary(ExchangeOrganization org) - { - // evaluate template - MailTemplate template = EvaluateOrganizationSummaryTemplate(org); - if (template == null || template.Body == null) - return null; - - return template.IsHtml ? template.Body : template.Body.Replace("\n", "
"); - } - - private static MailTemplate EvaluateOrganizationSummaryTemplate(ExchangeOrganization org) - { - #region create template context - Hashtable items = new Hashtable(); - - // add organization - items["org"] = org; - - // add package information - PackageInfo space = PackageController.GetPackage(org.PackageId); - items["space"] = space; - - // add user information - UserInfo user = UserController.GetUser(space.UserId); - items["user"] = user; - #endregion - - #region load template - // load template settings - UserSettings settings = UserController.GetUserSettings(user.UserId, UserSettings.EXCHANGE_HOSTED_EDITION_ORGANIZATION_SUMMARY); - if(settings == null) - return null; - - // create template - MailTemplate template = new MailTemplate(); - - // from - template.From = settings["From"]; - - // BCC - template.Bcc = settings["CC"]; - - // subject - template.Subject = settings["Subject"]; - - // body - template.IsHtml = user.HtmlMail; - string bodySetting = template.IsHtml ? "HtmlBody" : "TextBody"; - template.Body = settings[bodySetting]; - - // priority - string priority = settings["Priority"]; - template.Priority = String.IsNullOrEmpty(priority) - ? MailPriority.Normal - : (MailPriority)Enum.Parse(typeof(MailPriority), priority, true); - #endregion - - #region evaluate template - if(template.Subject != null) - template.Subject = PackageController.EvaluateTemplate(template.Subject, items); - - if(template.Body != null) - template.Body = PackageController.EvaluateTemplate(template.Body, items); - #endregion - - return template; - } - - private static PackageSettings GetExchangePackageSettings(ExchangeOrganization org) - { - // load package settings - return PackageController.GetPackageSettings(org.PackageId, PackageSettings.EXCHANGE_HOSTED_EDITION); - } - - public static ResultObject SendExchangeOrganizationSummary(int itemId, string toEmail) - { - ResultObject result = new ResultObject(); - result.IsSuccess = true; - - try - { - // initialize task manager - TaskManager.StartTask(TaskManagerSource, "SEND_SUMMARY"); - TaskManager.WriteParameter("Item ID", itemId); - TaskManager.WriteParameter("To e-mail", toEmail); - - // load organization item - ExchangeOrganization item = PackageController.GetPackageItem(itemId) as ExchangeOrganization; - if (item == null) - return Error(OrganizationNotFoundError); - - #region Check Space and Account - // Check account - int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo | DemandAccount.IsActive); - if (accountCheck < 0) - return Warning((-accountCheck).ToString()); - - // Check space - int packageCheck = SecurityContext.CheckPackage(item.PackageId, DemandPackage.IsActive); - if (packageCheck < 0) - return Warning((-packageCheck).ToString()); - #endregion - - // load organization details - ExchangeOrganization org = GetOrganizationDetails(item.Id); - if(org == null) - return Error(OrganizationNotFoundError); - - // get evaluated summary information - MailTemplate msg = EvaluateOrganizationSummaryTemplate(org); - if (msg == null) - return Error(SendOrganizationTemplateNotSetError); - - // send message - int sendResult = MailHelper.SendMessage(msg.From, toEmail, msg.Bcc, msg.Subject, msg.Body, msg.Priority, msg.IsHtml); - if (sendResult < 0) - return Error((-sendResult).ToString()); - - return result; - } - catch (Exception ex) - { - // log error - TaskManager.WriteError(ex); - - // exit with error code - return Error(SendOrganizationSummaryError, ex.Message); - } - finally - { - TaskManager.CompleteTask(); - } - } - - public static ResultObject AddOrganizationDomain(int itemId, string domainName) - { - ResultObject result = new ResultObject(); - result.IsSuccess = true; - - try - { - // initialize task manager - TaskManager.StartTask(TaskManagerSource, "ADD_DOMAIN"); - TaskManager.WriteParameter("itemId", itemId); - TaskManager.WriteParameter("domain", domainName); - - // load organization item - ExchangeOrganization item = PackageController.GetPackageItem(itemId) as ExchangeOrganization; - if (item == null) - return Error(OrganizationNotFoundError); - - #region Check Space and Account - // Check account - int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo | DemandAccount.IsActive); - if (accountCheck < 0) - return Warning((-accountCheck).ToString()); - - // Check space - int packageCheck = SecurityContext.CheckPackage(item.PackageId, DemandPackage.IsActive); - if (packageCheck < 0) - return Warning((-packageCheck).ToString()); - #endregion - - // get organization details - ExchangeOrganization org = GetOrganizationDetails(item.Id); - if (org == null) - return Error(OrganizationNotFoundError); - - // check domains quota - if(org.MaxDomainsCountQuota > -1 && org.Domains.Length >= org.MaxDomainsCountQuota) - return Error(AddDomainQuotaExceededError); - - // check if the domain already exists - DomainInfo domain = null; - int checkResult = ServerController.CheckDomain(domainName); - if (checkResult == BusinessErrorCodes.ERROR_DOMAIN_ALREADY_EXISTS) - { - // domain exists - // check if it belongs to the same space - domain = ServerController.GetDomain(domainName); - if (domain == null) - return Error((-checkResult).ToString()); - - if (domain.PackageId != org.PackageId) - return Error((-checkResult).ToString()); - - // check if domain is already used in this organization - foreach (ExchangeOrganizationDomain orgDomain in org.Domains) - { - if(String.Equals(orgDomain.Name, domainName, StringComparison.InvariantCultureIgnoreCase)) - return Error(AddDomainAlreadyUsedError); - } - } - else if (checkResult == BusinessErrorCodes.ERROR_RESTRICTED_DOMAIN) - { - return Error((-checkResult).ToString()); - } - - // create domain if required - if (domain == null) - { - domain = new DomainInfo(); - domain.PackageId = org.PackageId; - domain.DomainName = domainName; - domain.IsInstantAlias = false; - domain.IsSubDomain = false; - - int domainId = ServerController.AddDomain(domain); - if (domainId < 0) - return Error((-domainId).ToString()); - - // add domain - domain.DomainId = domainId; - } - - // get Exchange service - ExchangeServerHostedEdition exchange = GetExchangeService(item.ServiceId); - - // add domain - exchange.AddOrganizationDomain(item.Name, domainName); - - return result; - } - catch (Exception ex) - { - // log error - TaskManager.WriteError(ex); - - // exit with error code - return Error(AddDomainError, ex.Message); - } - finally - { - TaskManager.CompleteTask(); - } - } - - public static ResultObject DeleteOrganizationDomain(int itemId, string domainName) - { - ResultObject result = new ResultObject(); - result.IsSuccess = true; - - try - { - // initialize task manager - TaskManager.StartTask(TaskManagerSource, "DELETE_DOMAIN"); - TaskManager.WriteParameter("itemId", itemId); - TaskManager.WriteParameter("domain", domainName); - - // load organization item - ExchangeOrganization item = PackageController.GetPackageItem(itemId) as ExchangeOrganization; - if (item == null) - return Error(OrganizationNotFoundError); - - #region Check Space and Account - // Check account - int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo | DemandAccount.IsActive); - if (accountCheck < 0) - return Warning((-accountCheck).ToString()); - - // Check space - int packageCheck = SecurityContext.CheckPackage(item.PackageId, DemandPackage.IsActive); - if (packageCheck < 0) - return Warning((-packageCheck).ToString()); - #endregion - - // get Exchange service - ExchangeServerHostedEdition exchange = GetExchangeService(item.ServiceId); - - // delete domain - exchange.DeleteOrganizationDomain(item.Name, domainName); - - return result; - } - catch (Exception ex) - { - // log error - TaskManager.WriteError(ex); - - // exit with error code - return Error(DeleteDomainError, ex.Message); - } - finally - { - TaskManager.CompleteTask(); - } - } - - public static ResultObject UpdateOrganizationQuotas(int itemId, int mailboxesNumber, int contactsNumber, int distributionListsNumber) - { - ResultObject result = new ResultObject(); - result.IsSuccess = true; - - try - { - // initialize task manager - TaskManager.StartTask(TaskManagerSource, "UPDATE_QUOTAS"); - TaskManager.WriteParameter("itemId", itemId); - TaskManager.WriteParameter("mailboxesNumber", mailboxesNumber); - TaskManager.WriteParameter("contactsNumber", contactsNumber); - TaskManager.WriteParameter("distributionListsNumber", distributionListsNumber); - - // load organization item - ExchangeOrganization item = PackageController.GetPackageItem(itemId) as ExchangeOrganization; - if (item == null) - return Error(OrganizationNotFoundError); - - #region Check Space and Account - // Check account - int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo | DemandAccount.IsActive); - if (accountCheck < 0) - return Warning((-accountCheck).ToString()); - - // Check space - int packageCheck = SecurityContext.CheckPackage(item.PackageId, DemandPackage.IsActive); - if (packageCheck < 0) - return Warning((-packageCheck).ToString()); - #endregion - - // check quotas - UpdateOrganizationQuotas(item); - - if(item.MaxMailboxCountQuota > -1 && mailboxesNumber > item.MaxMailboxCountQuota) - return Error(UpdateQuotasWrongQuotaError); - if (item.MaxContactCountQuota > -1 && contactsNumber > item.MaxContactCountQuota) - return Error(UpdateQuotasWrongQuotaError); - if (item.MaxDistributionListCountQuota > -1 && distributionListsNumber > item.MaxDistributionListCountQuota) - return Error(UpdateQuotasWrongQuotaError); - - // get Exchange service - ExchangeServerHostedEdition exchange = GetExchangeService(item.ServiceId); - - // update quotas - exchange.UpdateOrganizationQuotas(item.Name, mailboxesNumber, contactsNumber, distributionListsNumber); - - return result; - } - catch (Exception ex) - { - // log error - TaskManager.WriteError(ex); - - // exit with error code - return Error(UpdateQuotasError, ex.Message); - } - finally - { - TaskManager.CompleteTask(); - } - } - - public static ResultObject UpdateOrganizationCatchAllAddress(int itemId, string catchAllEmail) - { - ResultObject result = new ResultObject(); - result.IsSuccess = true; - - try - { - // initialize task manager - TaskManager.StartTask(TaskManagerSource, "UPDATE_CATCHALL"); - TaskManager.WriteParameter("itemId", itemId); - TaskManager.WriteParameter("catchAllEmail", catchAllEmail); - - // load organization item - ExchangeOrganization item = PackageController.GetPackageItem(itemId) as ExchangeOrganization; - if (item == null) - return Error(OrganizationNotFoundError); - - #region Check Space and Account - // Check account - int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo | DemandAccount.IsActive); - if (accountCheck < 0) - return Warning((-accountCheck).ToString()); - - // Check space - int packageCheck = SecurityContext.CheckPackage(item.PackageId, DemandPackage.IsActive); - if (packageCheck < 0) - return Warning((-packageCheck).ToString()); - #endregion - - // get Exchange service - ExchangeServerHostedEdition exchange = GetExchangeService(item.ServiceId); - - // update catch-all - exchange.UpdateOrganizationCatchAllAddress(item.Name, catchAllEmail); - - // save new catch-all in the item - item.CatchAllAddress = catchAllEmail; - PackageController.UpdatePackageItem(item); - - return result; - } - catch (Exception ex) - { - // log error - TaskManager.WriteError(ex); - - // exit with error code - return Error(UpdateCatchAllError, ex.Message); - } - finally - { - TaskManager.CompleteTask(); - } - } - - public static ResultObject UpdateOrganizationServicePlan(int itemId, int newServiceId) - { - ResultObject result = new ResultObject(); - result.IsSuccess = true; - - try - { - // initialize task manager - TaskManager.StartTask(TaskManagerSource, "UPDATE_SERVICE"); - TaskManager.WriteParameter("itemId", itemId); - TaskManager.WriteParameter("newServiceId", newServiceId); - - // load organization item - ExchangeOrganization item = PackageController.GetPackageItem(itemId) as ExchangeOrganization; - if (item == null) - return Error(OrganizationNotFoundError); - - #region Check Space and Account - // Check account - int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo | DemandAccount.IsAdmin | DemandAccount.IsActive); - if (accountCheck < 0) - return Warning((-accountCheck).ToString()); - - // Check space - int packageCheck = SecurityContext.CheckPackage(item.PackageId, DemandPackage.IsActive); - if (packageCheck < 0) - return Warning((-packageCheck).ToString()); - #endregion - - // get Exchange service - ExchangeServerHostedEdition exchange = GetExchangeService(item.ServiceId); - - // load service settings to know ProgramID, OfferID - StringDictionary serviceSettings = ServerController.GetServiceSettings(newServiceId); - string programId = serviceSettings["programID"]; - string offerId = serviceSettings["offerID"]; - - // check settings - if(String.IsNullOrEmpty(programId)) - result.ErrorCodes.Add(ProgramIdIsNotSetError); - if (String.IsNullOrEmpty(offerId)) - result.ErrorCodes.Add(OfferIdIsNotSetError); - - // update service plan - exchange.UpdateOrganizationServicePlan(item.Name, programId, offerId); - - // move item between services - int moveResult = PackageController.MovePackageItem(itemId, newServiceId); - if (moveResult < 0) - return Error((-moveResult).ToString()); - - return result; - } - catch (Exception ex) - { - // log error - TaskManager.WriteError(ex); - - // exit with error code - return Error(UpdateServicePlanError, ex.Message); - } - finally - { - TaskManager.CompleteTask(); - } - } - - public static ResultObject DeleteOrganization(int itemId) - { - ResultObject result = new ResultObject(); - result.IsSuccess = true; - - try - { - // initialize task manager - TaskManager.StartTask(TaskManagerSource, "DELETE_ORGANIZATION"); - TaskManager.WriteParameter("itemId", itemId); - - // load organization item - ExchangeOrganization item = PackageController.GetPackageItem(itemId) as ExchangeOrganization; - if (item == null) - return Error(OrganizationNotFoundError); - - #region Check Space and Account - // Check account - int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo | DemandAccount.IsActive); - if (accountCheck < 0) - return Warning((-accountCheck).ToString()); - - // Check space - int packageCheck = SecurityContext.CheckPackage(item.PackageId, DemandPackage.IsActive); - if (packageCheck < 0) - return Warning((-packageCheck).ToString()); - #endregion - - // get Exchange service - ExchangeServerHostedEdition exchange = GetExchangeService(item.ServiceId); - - // delete organization - exchange.DeleteOrganization(item.Name); - - // delete meta-item - PackageController.DeletePackageItem(itemId); - - return result; - } - catch (Exception ex) - { - // log error - TaskManager.WriteError(ex); - - // exit with error code - return Error(DeleteOrganizationError, ex.Message); - } - finally - { - TaskManager.CompleteTask(); - } - } - - #region Private helpers - public static ExchangeServerHostedEdition GetExchangeService(int serviceId) - { - ExchangeServerHostedEdition ws = new ExchangeServerHostedEdition(); - ServiceProviderProxy.Init(ws, serviceId); - return ws; - } - #endregion - - #region Result object routines - private static T Warning(params string[] messageParts) - { - return Warning(null, messageParts); - } - - private static T Warning(ResultObject innerResult, params string[] messageParts) - { - return Result(innerResult, false, messageParts); - } - - private static T Error(params string[] messageParts) - { - return Error(null, messageParts); - } - - private static T Error(ResultObject innerResult, params string[] messageParts) - { - return Result(innerResult, true, messageParts); - } - - private static T Result(ResultObject innerResult, bool isError, params string[] messageParts) - { - object obj = Activator.CreateInstance(); - ResultObject result = (ResultObject)obj; - - // set error - result.IsSuccess = !isError; - - // add message - if (messageParts != null) - result.ErrorCodes.Add(String.Join(":", messageParts)); - - // copy errors from inner result - if (innerResult != null) - result.ErrorCodes.AddRange(innerResult.ErrorCodes); - - return (T)obj; - } - #endregion - } -} \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/Packages/PackageController.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/Packages/PackageController.cs index c4d60460..baf64911 100644 --- a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/Packages/PackageController.cs +++ b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/Packages/PackageController.cs @@ -1521,19 +1521,6 @@ namespace WebsitePanel.EnterpriseServer } } - // Exchange Hosted Edition - else if (String.Compare(PackageSettings.EXCHANGE_HOSTED_EDITION, settingsName, true) == 0) - { - // load Exchange service settings - int exchServiceId = GetPackageServiceId(packageId, ResourceGroups.ExchangeHostedEdition); - if (exchServiceId > 0) - { - StringDictionary exchSettings = ServerController.GetServiceSettings(exchServiceId); - settings["temporaryDomain"] = exchSettings["temporaryDomain"]; - settings["ecpURL"] = exchSettings["ecpURL"]; - } - } - // VPS else if (String.Compare(PackageSettings.VIRTUAL_PRIVATE_SERVERS, settingsName, true) == 0) { diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/WebsitePanel.EnterpriseServer.csproj b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/WebsitePanel.EnterpriseServer.csproj index cae3c3b8..a2556f80 100644 --- a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/WebsitePanel.EnterpriseServer.csproj +++ b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/WebsitePanel.EnterpriseServer.csproj @@ -89,7 +89,6 @@ - @@ -164,7 +163,6 @@ - @@ -292,10 +290,6 @@ esDatabaseServers.asmx Component - - esExchangeHostedEdition.asmx - Component - esExchangeServer.asmx Component diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/esExchangeHostedEdition.asmx b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/esExchangeHostedEdition.asmx deleted file mode 100644 index e6c85aa8..00000000 --- a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/esExchangeHostedEdition.asmx +++ /dev/null @@ -1 +0,0 @@ -<%@ WebService Language="C#" CodeBehind="esExchangeHostedEdition.asmx.cs" Class="WebsitePanel.EnterpriseServer.esExchangeHostedEdition" %> diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/esExchangeHostedEdition.asmx.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/esExchangeHostedEdition.asmx.cs deleted file mode 100644 index 300f93b9..00000000 --- a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/esExchangeHostedEdition.asmx.cs +++ /dev/null @@ -1,95 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Web; -using System.Web.Services; -using Microsoft.Web.Services3; -using System.ComponentModel; -using WebsitePanel.Providers.ExchangeHostedEdition; -using WebsitePanel.Providers.Common; -using WebsitePanel.Providers.ResultObjects; - -namespace WebsitePanel.EnterpriseServer -{ - /// - /// Summary description for esExchangeHostedEdition - /// - [WebService(Namespace = "http://smbsaas/websitepanel/enterpriseserver")] - [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] - [Policy("ServerPolicy")] - [ToolboxItem(false)] - public class esExchangeHostedEdition : WebService - { - [WebMethod] - public List GetOrganizations(int packageId) - { - return ExchangeHostedEditionController.GetOrganizations(packageId); - } - - [WebMethod] - public IntResult CreateExchangeOrganization(int packageId, string organizationId, - string domain, string adminName, string adminEmail, string adminPassword) - { - return ExchangeHostedEditionController.CreateOrganization(packageId, organizationId, domain, adminName, adminEmail, adminPassword); - } - - [WebMethod] - public ExchangeOrganization GetExchangeOrganizationDetails(int itemId) - { - return ExchangeHostedEditionController.GetOrganizationDetails(itemId); - } - - [WebMethod] - public List GetExchangeOrganizationDomains(int itemId) - { - return ExchangeHostedEditionController.GetOrganizationDomains(itemId); - } - - [WebMethod] - public string GetExchangeOrganizationSummary(int itemId) - { - return ExchangeHostedEditionController.GetExchangeOrganizationSummary(itemId); - } - - [WebMethod] - public ResultObject SendExchangeOrganizationSummary(int itemId, string toEmail) - { - return ExchangeHostedEditionController.SendExchangeOrganizationSummary(itemId, toEmail); - } - - [WebMethod] - public ResultObject AddExchangeOrganizationDomain(int itemId, string domain) - { - return ExchangeHostedEditionController.AddOrganizationDomain(itemId, domain); - } - - [WebMethod] - public ResultObject DeleteExchangeOrganizationDomain(int itemId, string domain) - { - return ExchangeHostedEditionController.DeleteOrganizationDomain(itemId, domain); - } - - [WebMethod] - public ResultObject UpdateExchangeOrganizationQuotas(int itemId, int mailboxesNumber, int contactsNumber, int distributionListsNumber) - { - return ExchangeHostedEditionController.UpdateOrganizationQuotas(itemId, mailboxesNumber, contactsNumber, distributionListsNumber); - } - - [WebMethod] - public ResultObject UpdateExchangeOrganizationCatchAllAddress(int itemId, string catchAllEmail) - { - return ExchangeHostedEditionController.UpdateOrganizationCatchAllAddress(itemId, catchAllEmail); - } - - [WebMethod] - public ResultObject UpdateExchangeOrganizationServicePlan(int itemId, int newServiceId) - { - return ExchangeHostedEditionController.UpdateOrganizationServicePlan(itemId, newServiceId); - } - - [WebMethod] - public ResultObject DeleteExchangeOrganization(int itemId) - { - return ExchangeHostedEditionController.DeleteOrganization(itemId); - } - } -} diff --git a/WebsitePanel/Sources/WebsitePanel.Providers.Base/ExchangeHostedEdition/ExchangeOrganization.cs b/WebsitePanel/Sources/WebsitePanel.Providers.Base/ExchangeHostedEdition/ExchangeOrganization.cs deleted file mode 100644 index 71a6d441..00000000 --- a/WebsitePanel/Sources/WebsitePanel.Providers.Base/ExchangeHostedEdition/ExchangeOrganization.cs +++ /dev/null @@ -1,43 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; - -namespace WebsitePanel.Providers.ExchangeHostedEdition -{ - public class ExchangeOrganization : ServiceProviderItem - { - // basic props - public string ExchangeControlPanelUrl { get; set; } - public string DistinguishedName { get; set; } - public string ServicePlan { get; set; } - public string ProgramId { get; set; } - public string OfferId { get; set; } - public string AdministratorName { get; set; } - public string AdministratorEmail { get; set; } - - // domains - public ExchangeOrganizationDomain[] Domains { get; set; } - - // this is real usage - public int MailboxCount { get; set; } - public int ContactCount { get; set; } - public int DistributionListCount { get; set; } - - // these quotas are set in Exchange for the organization - public int MailboxCountQuota { get; set; } - public int ContactCountQuota { get; set; } - public int DistributionListCountQuota { get; set; } - - // these quotas are set in the hosting plan + add-ons - public int MaxDomainsCountQuota { get; set; } - public int MaxMailboxCountQuota { get; set; } - public int MaxContactCountQuota { get; set; } - public int MaxDistributionListCountQuota { get; set; } - - // summary information - public string SummaryInformation { get; set; } - - [Persistent] - public string CatchAllAddress { get; set; } - } -} diff --git a/WebsitePanel/Sources/WebsitePanel.Providers.Base/ExchangeHostedEdition/ExchangeOrganizationDomain.cs b/WebsitePanel/Sources/WebsitePanel.Providers.Base/ExchangeHostedEdition/ExchangeOrganizationDomain.cs deleted file mode 100644 index 26cd4090..00000000 --- a/WebsitePanel/Sources/WebsitePanel.Providers.Base/ExchangeHostedEdition/ExchangeOrganizationDomain.cs +++ /dev/null @@ -1,14 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; - -namespace WebsitePanel.Providers.ExchangeHostedEdition -{ - public class ExchangeOrganizationDomain - { - public string Identity { get; set; } - public string Name { get; set; } - public bool IsDefault { get; set; } - public bool IsTemp { get; set; } - } -} diff --git a/WebsitePanel/Sources/WebsitePanel.Providers.Base/ExchangeHostedEdition/IExchangeHostedEdition.cs b/WebsitePanel/Sources/WebsitePanel.Providers.Base/ExchangeHostedEdition/IExchangeHostedEdition.cs deleted file mode 100644 index cc119413..00000000 --- a/WebsitePanel/Sources/WebsitePanel.Providers.Base/ExchangeHostedEdition/IExchangeHostedEdition.cs +++ /dev/null @@ -1,22 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; - -namespace WebsitePanel.Providers.ExchangeHostedEdition -{ - public interface IExchangeHostedEdition - { - void CreateOrganization(string organizationId, string programId, string offerId, - string domain, string adminName, string adminEmail, string adminPassword); - ExchangeOrganization GetOrganizationDetails(string organizationId); - - List GetOrganizationDomains(string organizationId); - void AddOrganizationDomain(string organizationId, string domain); - void DeleteOrganizationDomain(string organizationId, string domain); - - void UpdateOrganizationQuotas(string organizationId, int mailboxesNumber, int contactsNumber, int distributionListsNumber); - void UpdateOrganizationCatchAllAddress(string organizationId, string catchAllEmail); - void UpdateOrganizationServicePlan(string organizationId, string programId, string offerId); - void DeleteOrganization(string organizationId); - } -} diff --git a/WebsitePanel/Sources/WebsitePanel.Providers.Base/WebsitePanel.Providers.Base.csproj b/WebsitePanel/Sources/WebsitePanel.Providers.Base/WebsitePanel.Providers.Base.csproj index df882803..1d281456 100644 --- a/WebsitePanel/Sources/WebsitePanel.Providers.Base/WebsitePanel.Providers.Base.csproj +++ b/WebsitePanel/Sources/WebsitePanel.Providers.Base/WebsitePanel.Providers.Base.csproj @@ -74,9 +74,6 @@ - - - diff --git a/WebsitePanel/Sources/WebsitePanel.Server.Client/ExchangeServerHostedEditionProxy.cs b/WebsitePanel/Sources/WebsitePanel.Server.Client/ExchangeServerHostedEditionProxy.cs deleted file mode 100644 index 54257b39..00000000 --- a/WebsitePanel/Sources/WebsitePanel.Server.Client/ExchangeServerHostedEditionProxy.cs +++ /dev/null @@ -1,574 +0,0 @@ -//------------------------------------------------------------------------------ -// -// This code was generated by a tool. -// Runtime Version:2.0.50727.4952 -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -//------------------------------------------------------------------------------ - -// -// This source code was auto-generated by wsdl, Version=2.0.50727.42. -// -namespace WebsitePanel.Providers.ExchangeHostedEdition { - using System.Xml.Serialization; - using System.Web.Services; - using System.ComponentModel; - using System.Web.Services.Protocols; - using System; - using System.Diagnostics; - - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] - [System.Diagnostics.DebuggerStepThroughAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - [System.Web.Services.WebServiceBindingAttribute(Name="ExchangeServerHostedEditionSoap", Namespace="http://smbsaas/websitepanel/server/")] - [System.Xml.Serialization.XmlIncludeAttribute(typeof(ServiceProviderItem))] - public partial class ExchangeServerHostedEdition : Microsoft.Web.Services3.WebServicesClientProtocol { - - public ServiceProviderSettingsSoapHeader ServiceProviderSettingsSoapHeaderValue; - - private System.Threading.SendOrPostCallback CreateOrganizationOperationCompleted; - - private System.Threading.SendOrPostCallback GetOrganizationDomainsOperationCompleted; - - private System.Threading.SendOrPostCallback AddOrganizationDomainOperationCompleted; - - private System.Threading.SendOrPostCallback DeleteOrganizationDomainOperationCompleted; - - private System.Threading.SendOrPostCallback GetOrganizationDetailsOperationCompleted; - - private System.Threading.SendOrPostCallback UpdateOrganizationQuotasOperationCompleted; - - private System.Threading.SendOrPostCallback UpdateOrganizationCatchAllAddressOperationCompleted; - - private System.Threading.SendOrPostCallback UpdateOrganizationServicePlanOperationCompleted; - - private System.Threading.SendOrPostCallback DeleteOrganizationOperationCompleted; - - /// - public ExchangeServerHostedEdition() { - this.Url = "http://localhost:9003/ExchangeServerHostedEdition.asmx"; - } - - /// - public event CreateOrganizationCompletedEventHandler CreateOrganizationCompleted; - - /// - public event GetOrganizationDomainsCompletedEventHandler GetOrganizationDomainsCompleted; - - /// - public event AddOrganizationDomainCompletedEventHandler AddOrganizationDomainCompleted; - - /// - public event DeleteOrganizationDomainCompletedEventHandler DeleteOrganizationDomainCompleted; - - /// - public event GetOrganizationDetailsCompletedEventHandler GetOrganizationDetailsCompleted; - - /// - public event UpdateOrganizationQuotasCompletedEventHandler UpdateOrganizationQuotasCompleted; - - /// - public event UpdateOrganizationCatchAllAddressCompletedEventHandler UpdateOrganizationCatchAllAddressCompleted; - - /// - public event UpdateOrganizationServicePlanCompletedEventHandler UpdateOrganizationServicePlanCompleted; - - /// - public event DeleteOrganizationCompletedEventHandler DeleteOrganizationCompleted; - - /// - [System.Web.Services.Protocols.SoapHeaderAttribute("ServiceProviderSettingsSoapHeaderValue")] - [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://smbsaas/websitepanel/server/CreateOrganization", RequestNamespace="http://smbsaas/websitepanel/server/", ResponseNamespace="http://smbsaas/websitepanel/server/", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] - public void CreateOrganization(string organizationId, string programId, string offerId, string domain, string adminName, string adminEmail, string adminPassword) { - this.Invoke("CreateOrganization", new object[] { - organizationId, - programId, - offerId, - domain, - adminName, - adminEmail, - adminPassword}); - } - - /// - public System.IAsyncResult BeginCreateOrganization(string organizationId, string programId, string offerId, string domain, string adminName, string adminEmail, string adminPassword, System.AsyncCallback callback, object asyncState) { - return this.BeginInvoke("CreateOrganization", new object[] { - organizationId, - programId, - offerId, - domain, - adminName, - adminEmail, - adminPassword}, callback, asyncState); - } - - /// - public void EndCreateOrganization(System.IAsyncResult asyncResult) { - this.EndInvoke(asyncResult); - } - - /// - public void CreateOrganizationAsync(string organizationId, string programId, string offerId, string domain, string adminName, string adminEmail, string adminPassword) { - this.CreateOrganizationAsync(organizationId, programId, offerId, domain, adminName, adminEmail, adminPassword, null); - } - - /// - public void CreateOrganizationAsync(string organizationId, string programId, string offerId, string domain, string adminName, string adminEmail, string adminPassword, object userState) { - if ((this.CreateOrganizationOperationCompleted == null)) { - this.CreateOrganizationOperationCompleted = new System.Threading.SendOrPostCallback(this.OnCreateOrganizationOperationCompleted); - } - this.InvokeAsync("CreateOrganization", new object[] { - organizationId, - programId, - offerId, - domain, - adminName, - adminEmail, - adminPassword}, this.CreateOrganizationOperationCompleted, userState); - } - - private void OnCreateOrganizationOperationCompleted(object arg) { - if ((this.CreateOrganizationCompleted != null)) { - System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); - this.CreateOrganizationCompleted(this, new System.ComponentModel.AsyncCompletedEventArgs(invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); - } - } - - /// - [System.Web.Services.Protocols.SoapHeaderAttribute("ServiceProviderSettingsSoapHeaderValue")] - [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://smbsaas/websitepanel/server/GetOrganizationDomains", RequestNamespace="http://smbsaas/websitepanel/server/", ResponseNamespace="http://smbsaas/websitepanel/server/", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] - public ExchangeOrganizationDomain[] GetOrganizationDomains(string organizationId) { - object[] results = this.Invoke("GetOrganizationDomains", new object[] { - organizationId}); - return ((ExchangeOrganizationDomain[])(results[0])); - } - - /// - public System.IAsyncResult BeginGetOrganizationDomains(string organizationId, System.AsyncCallback callback, object asyncState) { - return this.BeginInvoke("GetOrganizationDomains", new object[] { - organizationId}, callback, asyncState); - } - - /// - public ExchangeOrganizationDomain[] EndGetOrganizationDomains(System.IAsyncResult asyncResult) { - object[] results = this.EndInvoke(asyncResult); - return ((ExchangeOrganizationDomain[])(results[0])); - } - - /// - public void GetOrganizationDomainsAsync(string organizationId) { - this.GetOrganizationDomainsAsync(organizationId, null); - } - - /// - public void GetOrganizationDomainsAsync(string organizationId, object userState) { - if ((this.GetOrganizationDomainsOperationCompleted == null)) { - this.GetOrganizationDomainsOperationCompleted = new System.Threading.SendOrPostCallback(this.OnGetOrganizationDomainsOperationCompleted); - } - this.InvokeAsync("GetOrganizationDomains", new object[] { - organizationId}, this.GetOrganizationDomainsOperationCompleted, userState); - } - - private void OnGetOrganizationDomainsOperationCompleted(object arg) { - if ((this.GetOrganizationDomainsCompleted != null)) { - System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); - this.GetOrganizationDomainsCompleted(this, new GetOrganizationDomainsCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); - } - } - - /// - [System.Web.Services.Protocols.SoapHeaderAttribute("ServiceProviderSettingsSoapHeaderValue")] - [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://smbsaas/websitepanel/server/AddOrganizationDomain", RequestNamespace="http://smbsaas/websitepanel/server/", ResponseNamespace="http://smbsaas/websitepanel/server/", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] - public void AddOrganizationDomain(string organizationId, string domain) { - this.Invoke("AddOrganizationDomain", new object[] { - organizationId, - domain}); - } - - /// - public System.IAsyncResult BeginAddOrganizationDomain(string organizationId, string domain, System.AsyncCallback callback, object asyncState) { - return this.BeginInvoke("AddOrganizationDomain", new object[] { - organizationId, - domain}, callback, asyncState); - } - - /// - public void EndAddOrganizationDomain(System.IAsyncResult asyncResult) { - this.EndInvoke(asyncResult); - } - - /// - public void AddOrganizationDomainAsync(string organizationId, string domain) { - this.AddOrganizationDomainAsync(organizationId, domain, null); - } - - /// - public void AddOrganizationDomainAsync(string organizationId, string domain, object userState) { - if ((this.AddOrganizationDomainOperationCompleted == null)) { - this.AddOrganizationDomainOperationCompleted = new System.Threading.SendOrPostCallback(this.OnAddOrganizationDomainOperationCompleted); - } - this.InvokeAsync("AddOrganizationDomain", new object[] { - organizationId, - domain}, this.AddOrganizationDomainOperationCompleted, userState); - } - - private void OnAddOrganizationDomainOperationCompleted(object arg) { - if ((this.AddOrganizationDomainCompleted != null)) { - System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); - this.AddOrganizationDomainCompleted(this, new System.ComponentModel.AsyncCompletedEventArgs(invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); - } - } - - /// - [System.Web.Services.Protocols.SoapHeaderAttribute("ServiceProviderSettingsSoapHeaderValue")] - [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://smbsaas/websitepanel/server/DeleteOrganizationDomain", RequestNamespace="http://smbsaas/websitepanel/server/", ResponseNamespace="http://smbsaas/websitepanel/server/", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] - public void DeleteOrganizationDomain(string organizationId, string domain) { - this.Invoke("DeleteOrganizationDomain", new object[] { - organizationId, - domain}); - } - - /// - public System.IAsyncResult BeginDeleteOrganizationDomain(string organizationId, string domain, System.AsyncCallback callback, object asyncState) { - return this.BeginInvoke("DeleteOrganizationDomain", new object[] { - organizationId, - domain}, callback, asyncState); - } - - /// - public void EndDeleteOrganizationDomain(System.IAsyncResult asyncResult) { - this.EndInvoke(asyncResult); - } - - /// - public void DeleteOrganizationDomainAsync(string organizationId, string domain) { - this.DeleteOrganizationDomainAsync(organizationId, domain, null); - } - - /// - public void DeleteOrganizationDomainAsync(string organizationId, string domain, object userState) { - if ((this.DeleteOrganizationDomainOperationCompleted == null)) { - this.DeleteOrganizationDomainOperationCompleted = new System.Threading.SendOrPostCallback(this.OnDeleteOrganizationDomainOperationCompleted); - } - this.InvokeAsync("DeleteOrganizationDomain", new object[] { - organizationId, - domain}, this.DeleteOrganizationDomainOperationCompleted, userState); - } - - private void OnDeleteOrganizationDomainOperationCompleted(object arg) { - if ((this.DeleteOrganizationDomainCompleted != null)) { - System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); - this.DeleteOrganizationDomainCompleted(this, new System.ComponentModel.AsyncCompletedEventArgs(invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); - } - } - - /// - [System.Web.Services.Protocols.SoapHeaderAttribute("ServiceProviderSettingsSoapHeaderValue")] - [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://smbsaas/websitepanel/server/GetOrganizationDetails", RequestNamespace="http://smbsaas/websitepanel/server/", ResponseNamespace="http://smbsaas/websitepanel/server/", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] - public ExchangeOrganization GetOrganizationDetails(string organizationId) { - object[] results = this.Invoke("GetOrganizationDetails", new object[] { - organizationId}); - return ((ExchangeOrganization)(results[0])); - } - - /// - public System.IAsyncResult BeginGetOrganizationDetails(string organizationId, System.AsyncCallback callback, object asyncState) { - return this.BeginInvoke("GetOrganizationDetails", new object[] { - organizationId}, callback, asyncState); - } - - /// - public ExchangeOrganization EndGetOrganizationDetails(System.IAsyncResult asyncResult) { - object[] results = this.EndInvoke(asyncResult); - return ((ExchangeOrganization)(results[0])); - } - - /// - public void GetOrganizationDetailsAsync(string organizationId) { - this.GetOrganizationDetailsAsync(organizationId, null); - } - - /// - public void GetOrganizationDetailsAsync(string organizationId, object userState) { - if ((this.GetOrganizationDetailsOperationCompleted == null)) { - this.GetOrganizationDetailsOperationCompleted = new System.Threading.SendOrPostCallback(this.OnGetOrganizationDetailsOperationCompleted); - } - this.InvokeAsync("GetOrganizationDetails", new object[] { - organizationId}, this.GetOrganizationDetailsOperationCompleted, userState); - } - - private void OnGetOrganizationDetailsOperationCompleted(object arg) { - if ((this.GetOrganizationDetailsCompleted != null)) { - System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); - this.GetOrganizationDetailsCompleted(this, new GetOrganizationDetailsCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); - } - } - - /// - [System.Web.Services.Protocols.SoapHeaderAttribute("ServiceProviderSettingsSoapHeaderValue")] - [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://smbsaas/websitepanel/server/UpdateOrganizationQuotas", RequestNamespace="http://smbsaas/websitepanel/server/", ResponseNamespace="http://smbsaas/websitepanel/server/", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] - public void UpdateOrganizationQuotas(string organizationId, int mailboxesNumber, int contactsNumber, int distributionListsNumber) { - this.Invoke("UpdateOrganizationQuotas", new object[] { - organizationId, - mailboxesNumber, - contactsNumber, - distributionListsNumber}); - } - - /// - public System.IAsyncResult BeginUpdateOrganizationQuotas(string organizationId, int mailboxesNumber, int contactsNumber, int distributionListsNumber, System.AsyncCallback callback, object asyncState) { - return this.BeginInvoke("UpdateOrganizationQuotas", new object[] { - organizationId, - mailboxesNumber, - contactsNumber, - distributionListsNumber}, callback, asyncState); - } - - /// - public void EndUpdateOrganizationQuotas(System.IAsyncResult asyncResult) { - this.EndInvoke(asyncResult); - } - - /// - public void UpdateOrganizationQuotasAsync(string organizationId, int mailboxesNumber, int contactsNumber, int distributionListsNumber) { - this.UpdateOrganizationQuotasAsync(organizationId, mailboxesNumber, contactsNumber, distributionListsNumber, null); - } - - /// - public void UpdateOrganizationQuotasAsync(string organizationId, int mailboxesNumber, int contactsNumber, int distributionListsNumber, object userState) { - if ((this.UpdateOrganizationQuotasOperationCompleted == null)) { - this.UpdateOrganizationQuotasOperationCompleted = new System.Threading.SendOrPostCallback(this.OnUpdateOrganizationQuotasOperationCompleted); - } - this.InvokeAsync("UpdateOrganizationQuotas", new object[] { - organizationId, - mailboxesNumber, - contactsNumber, - distributionListsNumber}, this.UpdateOrganizationQuotasOperationCompleted, userState); - } - - private void OnUpdateOrganizationQuotasOperationCompleted(object arg) { - if ((this.UpdateOrganizationQuotasCompleted != null)) { - System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); - this.UpdateOrganizationQuotasCompleted(this, new System.ComponentModel.AsyncCompletedEventArgs(invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); - } - } - - /// - [System.Web.Services.Protocols.SoapHeaderAttribute("ServiceProviderSettingsSoapHeaderValue")] - [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://smbsaas/websitepanel/server/UpdateOrganizationCatchAllAddress", RequestNamespace="http://smbsaas/websitepanel/server/", ResponseNamespace="http://smbsaas/websitepanel/server/", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] - public void UpdateOrganizationCatchAllAddress(string organizationId, string catchAllEmail) { - this.Invoke("UpdateOrganizationCatchAllAddress", new object[] { - organizationId, - catchAllEmail}); - } - - /// - public System.IAsyncResult BeginUpdateOrganizationCatchAllAddress(string organizationId, string catchAllEmail, System.AsyncCallback callback, object asyncState) { - return this.BeginInvoke("UpdateOrganizationCatchAllAddress", new object[] { - organizationId, - catchAllEmail}, callback, asyncState); - } - - /// - public void EndUpdateOrganizationCatchAllAddress(System.IAsyncResult asyncResult) { - this.EndInvoke(asyncResult); - } - - /// - public void UpdateOrganizationCatchAllAddressAsync(string organizationId, string catchAllEmail) { - this.UpdateOrganizationCatchAllAddressAsync(organizationId, catchAllEmail, null); - } - - /// - public void UpdateOrganizationCatchAllAddressAsync(string organizationId, string catchAllEmail, object userState) { - if ((this.UpdateOrganizationCatchAllAddressOperationCompleted == null)) { - this.UpdateOrganizationCatchAllAddressOperationCompleted = new System.Threading.SendOrPostCallback(this.OnUpdateOrganizationCatchAllAddressOperationCompleted); - } - this.InvokeAsync("UpdateOrganizationCatchAllAddress", new object[] { - organizationId, - catchAllEmail}, this.UpdateOrganizationCatchAllAddressOperationCompleted, userState); - } - - private void OnUpdateOrganizationCatchAllAddressOperationCompleted(object arg) { - if ((this.UpdateOrganizationCatchAllAddressCompleted != null)) { - System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); - this.UpdateOrganizationCatchAllAddressCompleted(this, new System.ComponentModel.AsyncCompletedEventArgs(invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); - } - } - - /// - [System.Web.Services.Protocols.SoapHeaderAttribute("ServiceProviderSettingsSoapHeaderValue")] - [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://smbsaas/websitepanel/server/UpdateOrganizationServicePlan", RequestNamespace="http://smbsaas/websitepanel/server/", ResponseNamespace="http://smbsaas/websitepanel/server/", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] - public void UpdateOrganizationServicePlan(string organizationId, string programId, string offerId) { - this.Invoke("UpdateOrganizationServicePlan", new object[] { - organizationId, - programId, - offerId}); - } - - /// - public System.IAsyncResult BeginUpdateOrganizationServicePlan(string organizationId, string programId, string offerId, System.AsyncCallback callback, object asyncState) { - return this.BeginInvoke("UpdateOrganizationServicePlan", new object[] { - organizationId, - programId, - offerId}, callback, asyncState); - } - - /// - public void EndUpdateOrganizationServicePlan(System.IAsyncResult asyncResult) { - this.EndInvoke(asyncResult); - } - - /// - public void UpdateOrganizationServicePlanAsync(string organizationId, string programId, string offerId) { - this.UpdateOrganizationServicePlanAsync(organizationId, programId, offerId, null); - } - - /// - public void UpdateOrganizationServicePlanAsync(string organizationId, string programId, string offerId, object userState) { - if ((this.UpdateOrganizationServicePlanOperationCompleted == null)) { - this.UpdateOrganizationServicePlanOperationCompleted = new System.Threading.SendOrPostCallback(this.OnUpdateOrganizationServicePlanOperationCompleted); - } - this.InvokeAsync("UpdateOrganizationServicePlan", new object[] { - organizationId, - programId, - offerId}, this.UpdateOrganizationServicePlanOperationCompleted, userState); - } - - private void OnUpdateOrganizationServicePlanOperationCompleted(object arg) { - if ((this.UpdateOrganizationServicePlanCompleted != null)) { - System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); - this.UpdateOrganizationServicePlanCompleted(this, new System.ComponentModel.AsyncCompletedEventArgs(invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); - } - } - - /// - [System.Web.Services.Protocols.SoapHeaderAttribute("ServiceProviderSettingsSoapHeaderValue")] - [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://smbsaas/websitepanel/server/DeleteOrganization", RequestNamespace="http://smbsaas/websitepanel/server/", ResponseNamespace="http://smbsaas/websitepanel/server/", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] - public void DeleteOrganization(string organizationId) { - this.Invoke("DeleteOrganization", new object[] { - organizationId}); - } - - /// - public System.IAsyncResult BeginDeleteOrganization(string organizationId, System.AsyncCallback callback, object asyncState) { - return this.BeginInvoke("DeleteOrganization", new object[] { - organizationId}, callback, asyncState); - } - - /// - public void EndDeleteOrganization(System.IAsyncResult asyncResult) { - this.EndInvoke(asyncResult); - } - - /// - public void DeleteOrganizationAsync(string organizationId) { - this.DeleteOrganizationAsync(organizationId, null); - } - - /// - public void DeleteOrganizationAsync(string organizationId, object userState) { - if ((this.DeleteOrganizationOperationCompleted == null)) { - this.DeleteOrganizationOperationCompleted = new System.Threading.SendOrPostCallback(this.OnDeleteOrganizationOperationCompleted); - } - this.InvokeAsync("DeleteOrganization", new object[] { - organizationId}, this.DeleteOrganizationOperationCompleted, userState); - } - - private void OnDeleteOrganizationOperationCompleted(object arg) { - if ((this.DeleteOrganizationCompleted != null)) { - System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); - this.DeleteOrganizationCompleted(this, new System.ComponentModel.AsyncCompletedEventArgs(invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); - } - } - - /// - public new void CancelAsync(object userState) { - base.CancelAsync(userState); - } - } - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] - public delegate void CreateOrganizationCompletedEventHandler(object sender, System.ComponentModel.AsyncCompletedEventArgs e); - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] - public delegate void GetOrganizationDomainsCompletedEventHandler(object sender, GetOrganizationDomainsCompletedEventArgs e); - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] - [System.Diagnostics.DebuggerStepThroughAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - public partial class GetOrganizationDomainsCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { - - private object[] results; - - internal GetOrganizationDomainsCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : - base(exception, cancelled, userState) { - this.results = results; - } - - /// - public ExchangeOrganizationDomain[] Result { - get { - this.RaiseExceptionIfNecessary(); - return ((ExchangeOrganizationDomain[])(this.results[0])); - } - } - } - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] - public delegate void AddOrganizationDomainCompletedEventHandler(object sender, System.ComponentModel.AsyncCompletedEventArgs e); - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] - public delegate void DeleteOrganizationDomainCompletedEventHandler(object sender, System.ComponentModel.AsyncCompletedEventArgs e); - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] - public delegate void GetOrganizationDetailsCompletedEventHandler(object sender, GetOrganizationDetailsCompletedEventArgs e); - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] - [System.Diagnostics.DebuggerStepThroughAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - public partial class GetOrganizationDetailsCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { - - private object[] results; - - internal GetOrganizationDetailsCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : - base(exception, cancelled, userState) { - this.results = results; - } - - /// - public ExchangeOrganization Result { - get { - this.RaiseExceptionIfNecessary(); - return ((ExchangeOrganization)(this.results[0])); - } - } - } - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] - public delegate void UpdateOrganizationQuotasCompletedEventHandler(object sender, System.ComponentModel.AsyncCompletedEventArgs e); - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] - public delegate void UpdateOrganizationCatchAllAddressCompletedEventHandler(object sender, System.ComponentModel.AsyncCompletedEventArgs e); - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] - public delegate void UpdateOrganizationServicePlanCompletedEventHandler(object sender, System.ComponentModel.AsyncCompletedEventArgs e); - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] - public delegate void DeleteOrganizationCompletedEventHandler(object sender, System.ComponentModel.AsyncCompletedEventArgs e); -} diff --git a/WebsitePanel/Sources/WebsitePanel.Server.Client/WebsitePanel.Server.Client.csproj b/WebsitePanel/Sources/WebsitePanel.Server.Client/WebsitePanel.Server.Client.csproj index 37f746e8..0ac386bf 100644 --- a/WebsitePanel/Sources/WebsitePanel.Server.Client/WebsitePanel.Server.Client.csproj +++ b/WebsitePanel/Sources/WebsitePanel.Server.Client/WebsitePanel.Server.Client.csproj @@ -78,7 +78,6 @@ - diff --git a/WebsitePanel/Sources/WebsitePanel.Server.sln b/WebsitePanel/Sources/WebsitePanel.Server.sln index 715e7c13..c4b625b2 100644 --- a/WebsitePanel/Sources/WebsitePanel.Server.sln +++ b/WebsitePanel/Sources/WebsitePanel.Server.sln @@ -93,8 +93,6 @@ Project("{F184B08F-C81C-45F6-A57F-5ABD9991F28F}") = "WebsitePanel.Providers.Mail EndProject Project("{F184B08F-C81C-45F6-A57F-5ABD9991F28F}") = "WebsitePanel.Providers.Mail.hMailServer5", "WebsitePanel.Providers.Mail.hMail5\WebsitePanel.Providers.Mail.hMailServer5.vbproj", "{8F644D50-D602-4AD3-8EB0-CA3C3676B18D}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WebsitePanel.Providers.ExchangeHostedEdition", "WebsitePanel.Providers.ExchangeHostedEdition\WebsitePanel.Providers.ExchangeHostedEdition.csproj", "{5D30E0E3-7AAD-4BE1-8043-3F3E9994D321}" -EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WebsitePanel.Providers.Mail.SmarterMail7", "WebsitePanel.Providers.Mail.SmarterMail7\WebsitePanel.Providers.Mail.SmarterMail7.csproj", "{FB773A2C-1CD3-4D76-9C4F-B6B7EB9E479C}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WebsitePanel.Providers.VirtualizationForPC.HyperVForPC", "WebsitePanel.Providers.Virtualization.HyperVForPC\WebsitePanel.Providers.VirtualizationForPC.HyperVForPC.csproj", "{64BEEB10-7F9F-4860-B2FF-84CDA02766B3}" @@ -267,10 +265,6 @@ Global {8F644D50-D602-4AD3-8EB0-CA3C3676B18D}.Debug|Any CPU.Build.0 = Debug|Any CPU {8F644D50-D602-4AD3-8EB0-CA3C3676B18D}.Release|Any CPU.ActiveCfg = Release|Any CPU {8F644D50-D602-4AD3-8EB0-CA3C3676B18D}.Release|Any CPU.Build.0 = Release|Any CPU - {5D30E0E3-7AAD-4BE1-8043-3F3E9994D321}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {5D30E0E3-7AAD-4BE1-8043-3F3E9994D321}.Debug|Any CPU.Build.0 = Debug|Any CPU - {5D30E0E3-7AAD-4BE1-8043-3F3E9994D321}.Release|Any CPU.ActiveCfg = Release|Any CPU - {5D30E0E3-7AAD-4BE1-8043-3F3E9994D321}.Release|Any CPU.Build.0 = Release|Any CPU {FB773A2C-1CD3-4D76-9C4F-B6B7EB9E479C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {FB773A2C-1CD3-4D76-9C4F-B6B7EB9E479C}.Debug|Any CPU.Build.0 = Debug|Any CPU {FB773A2C-1CD3-4D76-9C4F-B6B7EB9E479C}.Release|Any CPU.ActiveCfg = Release|Any CPU diff --git a/WebsitePanel/Sources/WebsitePanel.Server/ExchangeServerHostedEdition.asmx b/WebsitePanel/Sources/WebsitePanel.Server/ExchangeServerHostedEdition.asmx deleted file mode 100644 index fbecb5cd..00000000 --- a/WebsitePanel/Sources/WebsitePanel.Server/ExchangeServerHostedEdition.asmx +++ /dev/null @@ -1 +0,0 @@ -<%@ WebService Language="C#" CodeBehind="ExchangeServerHostedEdition.asmx.cs" Class="WebsitePanel.Server.ExchangeServerHostedEdition" %> diff --git a/WebsitePanel/Sources/WebsitePanel.Server/ExchangeServerHostedEdition.asmx.cs b/WebsitePanel/Sources/WebsitePanel.Server/ExchangeServerHostedEdition.asmx.cs deleted file mode 100644 index 8d03a17a..00000000 --- a/WebsitePanel/Sources/WebsitePanel.Server/ExchangeServerHostedEdition.asmx.cs +++ /dev/null @@ -1,201 +0,0 @@ -// Copyright (c) 2012, Outercurve Foundation. -// All rights reserved. -// -// Redistribution and use in source and binary forms, with or without modification, -// are permitted provided that the following conditions are met: -// -// - Redistributions of source code must retain the above copyright notice, this -// list of conditions and the following disclaimer. -// -// - Redistributions in binary form must reproduce the above copyright notice, -// this list of conditions and the following disclaimer in the documentation -// and/or other materials provided with the distribution. -// -// - Neither the name of the Outercurve Foundation nor the names of its -// contributors may be used to endorse or promote products derived from this -// software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR -// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON -// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -using System; -using System.Collections.Generic; -using System.Web; -using System.Web.Services; -using WebsitePanel.Providers; -using WebsitePanel.Providers.ExchangeHostedEdition; -using Microsoft.Web.Services3; -using System.Web.Services.Protocols; -using WebsitePanel.Server.Utils; - -namespace WebsitePanel.Server -{ - /// - /// Summary description for ExchangeHostedEdition - /// - [WebService(Namespace = "http://smbsaas/websitepanel/server/")] - [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] - [Policy("ServerPolicy")] - public class ExchangeServerHostedEdition : HostingServiceProviderWebService, IExchangeHostedEdition - { - private IExchangeHostedEdition ExchangeServer - { - get { return (IExchangeHostedEdition)Provider; } - } - - [WebMethod, SoapHeader("settings")] - public void CreateOrganization(string organizationId, string programId, string offerId, string domain, - string adminName, string adminEmail, string adminPassword) - { - try - { - Log.WriteStart("'{0}' CreateOrganization", ProviderSettings.ProviderName); - ExchangeServer.CreateOrganization(organizationId, programId, offerId, domain, adminName, adminEmail, adminPassword); - Log.WriteEnd("'{0}' CreateOrganization", ProviderSettings.ProviderName); - } - catch (Exception ex) - { - Log.WriteError(String.Format("'{0}' CreateOrganization", ProviderSettings.ProviderName), ex); - throw; - } - } - - [WebMethod, SoapHeader("settings")] - public List GetOrganizationDomains(string organizationId) - { - try - { - Log.WriteStart("'{0}' GetOrganizationDomains", ProviderSettings.ProviderName); - List result = ExchangeServer.GetOrganizationDomains(organizationId); - Log.WriteEnd("'{0}' GetOrganizationDomains", ProviderSettings.ProviderName); - return result; - } - catch (Exception ex) - { - Log.WriteError(String.Format("'{0}' GetOrganizationDomains", ProviderSettings.ProviderName), ex); - throw; - } - } - - [WebMethod, SoapHeader("settings")] - public void AddOrganizationDomain(string organizationId, string domain) - { - try - { - Log.WriteStart("'{0}' AddOrganizationDomain", ProviderSettings.ProviderName); - ExchangeServer.AddOrganizationDomain(organizationId, domain); - Log.WriteEnd("'{0}' AddOrganizationDomain", ProviderSettings.ProviderName); - } - catch (Exception ex) - { - Log.WriteError(String.Format("'{0}' AddOrganizationDomain", ProviderSettings.ProviderName), ex); - throw; - } - } - - [WebMethod, SoapHeader("settings")] - public void DeleteOrganizationDomain(string organizationId, string domain) - { - try - { - Log.WriteStart("'{0}' DeleteOrganizationDomain", ProviderSettings.ProviderName); - ExchangeServer.DeleteOrganizationDomain(organizationId, domain); - Log.WriteEnd("'{0}' DeleteOrganizationDomain", ProviderSettings.ProviderName); - } - catch (Exception ex) - { - Log.WriteError(String.Format("'{0}' DeleteOrganizationDomain", ProviderSettings.ProviderName), ex); - throw; - } - } - - [WebMethod, SoapHeader("settings")] - public ExchangeOrganization GetOrganizationDetails(string organizationId) - { - try - { - Log.WriteStart("'{0}' GetOrganizationDetails", ProviderSettings.ProviderName); - ExchangeOrganization result = ExchangeServer.GetOrganizationDetails(organizationId); - Log.WriteEnd("'{0}' GetOrganizationDetails", ProviderSettings.ProviderName); - return result; - } - catch (Exception ex) - { - Log.WriteError(String.Format("'{0}' GetOrganizationDetails", ProviderSettings.ProviderName), ex); - throw; - } - } - - [WebMethod, SoapHeader("settings")] - public void UpdateOrganizationQuotas(string organizationId, int mailboxesNumber, int contactsNumber, int distributionListsNumber) - { - try - { - Log.WriteStart("'{0}' UpdateOrganizationQuotas", ProviderSettings.ProviderName); - ExchangeServer.UpdateOrganizationQuotas(organizationId, mailboxesNumber, contactsNumber, distributionListsNumber); - Log.WriteEnd("'{0}' UpdateOrganizationQuotas", ProviderSettings.ProviderName); - } - catch (Exception ex) - { - Log.WriteError(String.Format("'{0}' UpdateOrganizationQuotas", ProviderSettings.ProviderName), ex); - throw; - } - } - - [WebMethod, SoapHeader("settings")] - public void UpdateOrganizationCatchAllAddress(string organizationId, string catchAllEmail) - { - try - { - Log.WriteStart("'{0}' UpdateOrganizationCatchAllAddress", ProviderSettings.ProviderName); - ExchangeServer.UpdateOrganizationCatchAllAddress(organizationId, catchAllEmail); - Log.WriteEnd("'{0}' UpdateOrganizationCatchAllAddress", ProviderSettings.ProviderName); - } - catch (Exception ex) - { - Log.WriteError(String.Format("'{0}' UpdateOrganizationCatchAllAddress", ProviderSettings.ProviderName), ex); - throw; - } - } - - [WebMethod, SoapHeader("settings")] - public void UpdateOrganizationServicePlan(string organizationId, string programId, string offerId) - { - try - { - Log.WriteStart("'{0}' UpdateOeganizationServicePlan", ProviderSettings.ProviderName); - ExchangeServer.UpdateOrganizationServicePlan(organizationId, programId, offerId); - Log.WriteEnd("'{0}' UpdateOeganizationServicePlan", ProviderSettings.ProviderName); - } - catch (Exception ex) - { - Log.WriteError(String.Format("'{0}' UpdateOeganizationServicePlan", ProviderSettings.ProviderName), ex); - throw; - } - } - - [WebMethod, SoapHeader("settings")] - public void DeleteOrganization(string organizationId) - { - try - { - Log.WriteStart("'{0}' DeleteOrganization", ProviderSettings.ProviderName); - ExchangeServer.DeleteOrganization(organizationId); - Log.WriteEnd("'{0}' DeleteOrganization", ProviderSettings.ProviderName); - } - catch (Exception ex) - { - Log.WriteError(String.Format("'{0}' DeleteOrganization", ProviderSettings.ProviderName), ex); - throw; - } - } - } -} diff --git a/WebsitePanel/Sources/WebsitePanel.Server/WebsitePanel.Server.csproj b/WebsitePanel/Sources/WebsitePanel.Server/WebsitePanel.Server.csproj index 71d04878..affbf40f 100644 --- a/WebsitePanel/Sources/WebsitePanel.Server/WebsitePanel.Server.csproj +++ b/WebsitePanel/Sources/WebsitePanel.Server/WebsitePanel.Server.csproj @@ -68,7 +68,6 @@ - @@ -109,10 +108,6 @@ - - ExchangeServerHostedEdition.asmx - Component - OCSEdgeServer.asmx Component diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/App_Data/ModulesData.config b/WebsitePanel/Sources/WebsitePanel.WebPortal/App_Data/ModulesData.config index ffd5eab9..65182013 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/App_Data/ModulesData.config +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/App_Data/ModulesData.config @@ -68,7 +68,6 @@ - @@ -121,7 +120,6 @@ - diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/App_Data/WebsitePanel_Modules.config b/WebsitePanel/Sources/WebsitePanel.WebPortal/App_Data/WebsitePanel_Modules.config index 616e6848..c979a2a4 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/App_Data/WebsitePanel_Modules.config +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/App_Data/WebsitePanel_Modules.config @@ -580,17 +580,4 @@ - - - - - - - - - - - - - \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/App_Data/WebsitePanel_Pages.config b/WebsitePanel/Sources/WebsitePanel.WebPortal/App_Data/WebsitePanel_Pages.config index 70ffb1a7..d9a76036 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/App_Data/WebsitePanel_Pages.config +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/App_Data/WebsitePanel_Pages.config @@ -557,16 +557,4 @@ - - diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/App_GlobalResources/WebsitePanel_Modules.ascx.resx b/WebsitePanel/Sources/WebsitePanel.WebPortal/App_GlobalResources/WebsitePanel_Modules.ascx.resx index 184b2e80..3541969a 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/App_GlobalResources/WebsitePanel_Modules.ascx.resx +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/App_GlobalResources/WebsitePanel_Modules.ascx.resx @@ -735,9 +735,6 @@ Allocate Web Site IP Addresses - - Exchange Hosting Mode - Add Organization Domain diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/App_GlobalResources/WebsitePanel_Pages.ascx.resx b/WebsitePanel/Sources/WebsitePanel.WebPortal/App_GlobalResources/WebsitePanel_Pages.ascx.resx index 887c6a8f..7a3e2bc4 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/App_GlobalResources/WebsitePanel_Pages.ascx.resx +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/App_GlobalResources/WebsitePanel_Pages.ascx.resx @@ -453,12 +453,6 @@ {user} - {space} - Web - - Exchange Hosting Mode - - - {user} - {space} - Exchange Hosting Mode - Virtual Private Cloud diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/App_GlobalResources/WebsitePanel_SharedResources.ascx.resx b/WebsitePanel/Sources/WebsitePanel.WebPortal/App_GlobalResources/WebsitePanel_SharedResources.ascx.resx index a7b4c5e9..2bf42484 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/App_GlobalResources/WebsitePanel_SharedResources.ascx.resx +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/App_GlobalResources/WebsitePanel_SharedResources.ascx.resx @@ -4822,138 +4822,12 @@ SSL - - Contacts - - - Distribution Lists - - - Domains - - - Mailboxes - - - Exchange 2010 Hosting Mode - - - Exchange Hosting Mode - - - Error creating Exchange organization - - - Exchange organization cannot be deleted - - - Error sending Exchange organization summary information - - - Please contact your hosting provider. - - - Please contact your hosting provider. - Exchange Organization - - Exchange organization summary information has been sent - - - You have to tick a checkbox to confirm organization deletion - - - Organization domain cannot be added - - - Organization quotas cannot be changed - - - Organization Service Plan cannot be changed - - - Error reading Exchange organization domains - - - Organization details cannot be loaded. - - - Please contact your hosting provider. - - - Please contact your hosting provider. - - - Please contact your hosting provider. - - - Please contact your hosting provider. - - - Organization domain cannot be deleted - - - Specified domain name already added into organization. - - - Error adding organization domain. - - - Specified domain name already exists. - - - Maximum domains quota has been reached. - - - Error creating organization. See system logs for detailed messages. - - - Error deleting organization domain. - - - Error deleting organization. See system logs for detailed messages. - - - Exchange Hosting Mode service is not enabled for the hosting space. - - - General module error. - - - Offer ID is not specified on Exchange service settings. - - - Organization not found. - - - Program ID is not specified on Exchange service settings. - - - Error sending organization summary information. - - - Organization summary information template is not set. - - - Error updating catch-all account. - - - Error updating organization quotas. - - - One of the specified quotas exceed maximum value allowed. - - - Error changing organization service plan. See system logs for detailed messages. - Disable Mailbox Size Edit - - Exchange Hosting Mode - Unlimited diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/App_LocalResources/SpaceSettings.ascx.resx b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/App_LocalResources/SpaceSettings.ascx.resx index 1c04fc96..9bb30cb6 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/App_LocalResources/SpaceSettings.ascx.resx +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/App_LocalResources/SpaceSettings.ascx.resx @@ -141,9 +141,6 @@ Virtual Private Servers - - Exchange Hosting Mode - Virtual Private Servers for Private Cloud diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/App_LocalResources/UserAccountMailTemplateSettings.ascx.resx b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/App_LocalResources/UserAccountMailTemplateSettings.ascx.resx index dab2e293..61f11639 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/App_LocalResources/UserAccountMailTemplateSettings.ascx.resx +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/App_LocalResources/UserAccountMailTemplateSettings.ascx.resx @@ -141,7 +141,4 @@ VPS Summary Letter - - Exchange Hosting Mode Organization Summary - \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/App_LocalResources/UserAccountPolicySettings.ascx.resx b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/App_LocalResources/UserAccountPolicySettings.ascx.resx index 7db6e48c..88e2ac28 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/App_LocalResources/UserAccountPolicySettings.ascx.resx +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/App_LocalResources/UserAccountPolicySettings.ascx.resx @@ -150,7 +150,4 @@ WEB Policy - - Exchange Hosting Mode Policy - \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/Code/Framework/ES.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/Code/Framework/ES.cs index c320efb9..845c52e4 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/Code/Framework/ES.cs +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/Code/Framework/ES.cs @@ -206,11 +206,6 @@ namespace WebsitePanel.Portal get { return GetCachedProxy(); } } - public esExchangeHostedEdition ExchangeHostedEdition - { - get { return GetCachedProxy(); } - } - protected ES() { } diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeHostedEdition/AddOrganizationDomain.ascx b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeHostedEdition/AddOrganizationDomain.ascx deleted file mode 100644 index 70182d45..00000000 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeHostedEdition/AddOrganizationDomain.ascx +++ /dev/null @@ -1,30 +0,0 @@ -<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="AddOrganizationDomain.ascx.cs" Inherits="WebsitePanel.Portal.ExchangeHostedEdition.AddOrganizationDomain" %> -<%@ Register Src="../UserControls/SimpleMessageBox.ascx" TagName="SimpleMessageBox" TagPrefix="wsp" %> -<%@ Register Src="../UserControls/EnableAsyncTasksSupport.ascx" TagName="EnableAsyncTasksSupport" TagPrefix="wsp" %> - - - -
- - - - - - - - -
Domain: - - - * -
-
-
- - -
\ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeHostedEdition/AddOrganizationDomain.ascx.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeHostedEdition/AddOrganizationDomain.ascx.cs deleted file mode 100644 index 05e0f306..00000000 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeHostedEdition/AddOrganizationDomain.ascx.cs +++ /dev/null @@ -1,54 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Web; -using System.Web.UI; -using System.Web.UI.WebControls; -using WebsitePanel.Providers.Common; - -namespace WebsitePanel.Portal.ExchangeHostedEdition -{ - public partial class AddOrganizationDomain : WebsitePanelModuleBase - { - protected void Page_Load(object sender, EventArgs e) - { - } - - protected void update_Click(object sender, EventArgs e) - { - if (!Page.IsValid) - return; - - try - { - // call service - ResultObject result = ES.Services.ExchangeHostedEdition.AddExchangeOrganizationDomain(PanelRequest.ItemID, domain.Text.Trim()); - - // check results - if (result.IsSuccess) - { - // navigate to details - RedirectBack(); - } - else - { - // display message - messageBox.ShowMessage(result, "EXCHANGE_HOSTED_ADD_DOMAIN", "ExchangeHostedEdition"); - } - } - catch (Exception ex) - { - messageBox.ShowErrorMessage("EXCHANGE_HOSTED_ADD_DOMAIN", ex); - } - } - - protected void cancel_Click(object sender, EventArgs e) - { - RedirectBack(); - } - - private void RedirectBack() - { - Response.Redirect(NavigateURL("SpaceID", PanelSecurity.PackageId.ToString(), "ItemID=" + PanelRequest.ItemID.ToString())); - } - } -} \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeHostedEdition/AddOrganizationDomain.ascx.designer.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeHostedEdition/AddOrganizationDomain.ascx.designer.cs deleted file mode 100644 index 62085298..00000000 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeHostedEdition/AddOrganizationDomain.ascx.designer.cs +++ /dev/null @@ -1,96 +0,0 @@ -//------------------------------------------------------------------------------ -// -// This code was generated by a tool. -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -//------------------------------------------------------------------------------ - -namespace WebsitePanel.Portal.ExchangeHostedEdition { - - - public partial class AddOrganizationDomain { - - /// - /// asyncTasks control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::WebsitePanel.Portal.EnableAsyncTasksSupport asyncTasks; - - /// - /// messageBox control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::WebsitePanel.Portal.UserControls.SimpleMessageBox messageBox; - - /// - /// validationErrors control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.ValidationSummary validationErrors; - - /// - /// locDomain control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.Localize locDomain; - - /// - /// domain control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.TextBox domain; - - /// - /// requireDomain control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.RequiredFieldValidator requireDomain; - - /// - /// requireCorrectDomain control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.RegularExpressionValidator requireCorrectDomain; - - /// - /// update control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.Button update; - - /// - /// cancel control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.Button cancel; - } -} diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeHostedEdition/App_LocalResources/AddOrganizationDomain.ascx.resx b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeHostedEdition/App_LocalResources/AddOrganizationDomain.ascx.resx deleted file mode 100644 index edca5239..00000000 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeHostedEdition/App_LocalResources/AddOrganizationDomain.ascx.resx +++ /dev/null @@ -1,144 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Cancel - - - Domain: - - - Enter correct domain name in the form "mydomain.com" or "sub.mydomain.com" - - - ! - - - Select domain - - - * - - - ShowProgressDialog('Adding organization domain...'); - - - Update - - \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeHostedEdition/App_LocalResources/CreateOrganization.ascx.resx b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeHostedEdition/App_LocalResources/CreateOrganization.ascx.resx deleted file mode 100644 index a9b8538e..00000000 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeHostedEdition/App_LocalResources/CreateOrganization.ascx.resx +++ /dev/null @@ -1,171 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - ShowProgressDialog('Creating Exchange organization...'); - - - Create Organization - - - Administrator e-mail: - - - Administrator name: - - - Administrator password: - - - Organization name: - - - Manage domains - - - Enter administrator e-mail address - - - * - - - Enter administrator display name - - - * - - - Enter correct domain name in the form "mydomain.com" or "sub.mydomain.com" - - - ! - - - Specify organization domain - - - * - - - Enter organization name - - - * - - \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeHostedEdition/App_LocalResources/DeleteOrganization.ascx.resx b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeHostedEdition/App_LocalResources/DeleteOrganization.ascx.resx deleted file mode 100644 index 6934db62..00000000 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeHostedEdition/App_LocalResources/DeleteOrganization.ascx.resx +++ /dev/null @@ -1,135 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Cancel - - - I confirm deletion of this organization and all its contents - - - ShowProgressDialog('Deleting Exchange organization...'); - - - Delete - - - <p><b>All organization user accounts, contacts, distribution lists and public folders will be deleted.</b></p> - - \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeHostedEdition/App_LocalResources/OrganizationDetails.ascx.resx b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeHostedEdition/App_LocalResources/OrganizationDetails.ascx.resx deleted file mode 100644 index 8a007bc5..00000000 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeHostedEdition/App_LocalResources/OrganizationDetails.ascx.resx +++ /dev/null @@ -1,234 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Add Domain - - - (not set) - - - Change Service Plan - - - if(!confirm('Are you sure you want to remove selected domain?')) return false; else ShowProgressDialog('Deleting domain...'); - - - Delete - - - Delete Organization - - - {0} of {1} - - - There are no domains allowed for this organization. Click "Add Domain" button to add domain. - - - Default - - - Temporary - - - Domain - - - This block is visible to system administrators only. - - - Administrator e-mail: - - - Administrator name: - - - Catch-all - - - Catch-all address: - - - Contacts: - - - Distribution Lists: - - - Domains - - - Total domains used: - - - Exchange Control Panel: - - - Mailboxes: - - - Offer ID: - - - Organization Details - - - Organization name: - - - Program ID: - - - Quotas - - - Send to e-mail: - - - Service: - - - Service Plan - - - Setup Instructions - - - {0} of {1} (max {2}) - - - * - - - Send - - - Set Catch-all - - - (summary information template is not set) - - - Unlimited - - - Update Quotas - - \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeHostedEdition/App_LocalResources/UpdateOrganizationCatchAll.ascx.resx b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeHostedEdition/App_LocalResources/UpdateOrganizationCatchAll.ascx.resx deleted file mode 100644 index 643fbd36..00000000 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeHostedEdition/App_LocalResources/UpdateOrganizationCatchAll.ascx.resx +++ /dev/null @@ -1,159 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Cancel - - - Disable catch-all - - - Enable catch-all - - - Catch-all mailbox: - - - Enter catch-all e-mail address - - - * - - - Enter correct e-mail address - - - ! - - - Select domain - - - * - - - <Select domain> - - - ShowProgressDialog('Updating organization Catch-all address...'); - - - Update - - \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeHostedEdition/App_LocalResources/UpdateOrganizationQuotas.ascx.resx b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeHostedEdition/App_LocalResources/UpdateOrganizationQuotas.ascx.resx deleted file mode 100644 index 6bd7fc79..00000000 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeHostedEdition/App_LocalResources/UpdateOrganizationQuotas.ascx.resx +++ /dev/null @@ -1,180 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Cancel - - - Contacts: - - - Distribution Lists: - - - Mailboxes: - - - (max {0}) - - - Specify correct number - - - ! - - - Specify correct number - - - ! - - - Specify correct number - - - ! - - - Enter contacts quota - - - * - - - Enter distribution lists quota - - - * - - - Enter mailboxes quota - - - * - - - Unlimited - - - ShowProgressDialog('Updating organization quotas...'); - - - Update - - \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeHostedEdition/App_LocalResources/UpdateOrganizationServicePlan.ascx.resx b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeHostedEdition/App_LocalResources/UpdateOrganizationServicePlan.ascx.resx deleted file mode 100644 index bc03f039..00000000 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeHostedEdition/App_LocalResources/UpdateOrganizationServicePlan.ascx.resx +++ /dev/null @@ -1,153 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - ShowProgressDialog('Updating organization service plan...'); - - - Apply - - - Cancel - - - Current Service Plan - - - New Service Plan - - - Offer ID: - - - Program ID: - - - Service: - - - Select new service - - - * - - - <Select service> - - \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeHostedEdition/CreateOrganization.ascx b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeHostedEdition/CreateOrganization.ascx deleted file mode 100644 index 49cd603a..00000000 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeHostedEdition/CreateOrganization.ascx +++ /dev/null @@ -1,73 +0,0 @@ -<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="CreateOrganization.ascx.cs" - Inherits="WebsitePanel.Portal.ExchangeHostedEdition.CreateOrganization" %> -<%@ Register Src="../UserControls/PasswordControl.ascx" TagName="PasswordControl" - TagPrefix="wsp" %> -<%@ Register Src="../UserControls/SimpleMessageBox.ascx" TagName="SimpleMessageBox" - TagPrefix="wsp" %> -<%@ Register Src="../UserControls/EnableAsyncTasksSupport.ascx" TagName="EnableAsyncTasksSupport" - TagPrefix="wsp" %> - - - -
- - - - - - - - - - - - - - - - - - - -
- Organization name: - - - -
- Administrator name: - - - -
- Administrator e-mail: - - - - @ - - - * -
- Administrator password: - - - -
-
-
- -
-
diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeHostedEdition/CreateOrganization.ascx.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeHostedEdition/CreateOrganization.ascx.cs deleted file mode 100644 index d1d17829..00000000 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeHostedEdition/CreateOrganization.ascx.cs +++ /dev/null @@ -1,56 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Web; -using System.Web.UI; -using System.Web.UI.WebControls; -using WebsitePanel.Providers.ResultObjects; -using WebsitePanel.EnterpriseServer; - -namespace WebsitePanel.Portal.ExchangeHostedEdition -{ - public partial class CreateOrganization : WebsitePanelModuleBase - { - protected void Page_Load(object sender, EventArgs e) - { - if (!IsPostBack) - { - // apply password policy - administratorPassword.SetPackagePolicy(PanelSecurity.PackageId, UserSettings.EXCHANGE_HOSTED_EDITION_POLICY, "MailboxPasswordPolicy"); - } - } - - protected void createOrganization_Click(object sender, EventArgs e) - { - if (!Page.IsValid) - return; - - try - { - string orgDomain = domain.Text.Trim(); - string adminEmail = administratorEmail.Text.Trim() + "@" + orgDomain; - - IntResult result = ES.Services.ExchangeHostedEdition.CreateExchangeOrganization(PanelSecurity.PackageId, - organizationName.Text.Trim(), - orgDomain, - administratorName.Text.Trim(), - adminEmail, - administratorPassword.Password); - - if (result.IsSuccess) - { - // navigate to details - Response.Redirect(NavigateURL("SpaceID", PanelSecurity.PackageId.ToString(), "ItemID=" + result.Value.ToString())); - } - else - { - // display message - messageBox.ShowMessage(result, "EXCHANGE_HOSTED_CREATE_ORGANIZATION", "ExchangeHostedEdition"); - } - } - catch (Exception ex) - { - messageBox.ShowErrorMessage("EXCHANGE_HOSTED_CREATE_ORGANIZATION", ex); - } - } - } -} \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeHostedEdition/CreateOrganization.ascx.designer.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeHostedEdition/CreateOrganization.ascx.designer.cs deleted file mode 100644 index 5ec75218..00000000 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeHostedEdition/CreateOrganization.ascx.designer.cs +++ /dev/null @@ -1,186 +0,0 @@ -//------------------------------------------------------------------------------ -// -// This code was generated by a tool. -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -//------------------------------------------------------------------------------ - -namespace WebsitePanel.Portal.ExchangeHostedEdition { - - - public partial class CreateOrganization { - - /// - /// asyncTasks control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::WebsitePanel.Portal.EnableAsyncTasksSupport asyncTasks; - - /// - /// CreateExchangeOrganizationPanel control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.Panel CreateExchangeOrganizationPanel; - - /// - /// messageBox control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::WebsitePanel.Portal.UserControls.SimpleMessageBox messageBox; - - /// - /// validationErrors control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.ValidationSummary validationErrors; - - /// - /// locOrganizationName control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.Localize locOrganizationName; - - /// - /// organizationName control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.TextBox organizationName; - - /// - /// requireOrganizationName control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.RequiredFieldValidator requireOrganizationName; - - /// - /// locAdministratorName control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.Localize locAdministratorName; - - /// - /// administratorName control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.TextBox administratorName; - - /// - /// requireAdministratorName control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.RequiredFieldValidator requireAdministratorName; - - /// - /// locAdministratorEmail control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.Localize locAdministratorEmail; - - /// - /// administratorEmail control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.TextBox administratorEmail; - - /// - /// requireAdministratorEmail control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.RequiredFieldValidator requireAdministratorEmail; - - /// - /// domain control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.TextBox domain; - - /// - /// requireDomain control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.RequiredFieldValidator requireDomain; - - /// - /// requireCorrectDomain control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.RegularExpressionValidator requireCorrectDomain; - - /// - /// locAdministratorPassword control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.Localize locAdministratorPassword; - - /// - /// administratorPassword control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::WebsitePanel.Portal.PasswordControl administratorPassword; - - /// - /// createOrganization control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.Button createOrganization; - } -} diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeHostedEdition/DeleteOrganization.ascx b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeHostedEdition/DeleteOrganization.ascx deleted file mode 100644 index 532fed8a..00000000 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeHostedEdition/DeleteOrganization.ascx +++ /dev/null @@ -1,21 +0,0 @@ -<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="DeleteOrganization.ascx.cs" Inherits="WebsitePanel.Portal.ExchangeHostedEdition.DeleteOrganization" %> -<%@ Register Src="../UserControls/SimpleMessageBox.ascx" TagName="SimpleMessageBox" TagPrefix="wsp" %> -<%@ Register Src="../UserControls/EnableAsyncTasksSupport.ascx" TagName="EnableAsyncTasksSupport" TagPrefix="wsp" %> - - - -
- - -
- -
- - -
-
- - -
\ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeHostedEdition/DeleteOrganization.ascx.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeHostedEdition/DeleteOrganization.ascx.cs deleted file mode 100644 index 1197cad6..00000000 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeHostedEdition/DeleteOrganization.ascx.cs +++ /dev/null @@ -1,54 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Web; -using System.Web.UI; -using System.Web.UI.WebControls; -using WebsitePanel.Providers.Common; - -namespace WebsitePanel.Portal.ExchangeHostedEdition -{ - public partial class DeleteOrganization : WebsitePanelModuleBase - { - protected void Page_Load(object sender, EventArgs e) - { - - } - - protected void delete_Click(object sender, EventArgs e) - { - if (!Page.IsValid) - return; - - if (!confirmDelete.Checked) - { - messageBox.ShowWarningMessage("EXCHANGE_HOSTED_CONFIRM_DELETE_ORGANIZATION"); - return; - } - - try - { - ResultObject result = ES.Services.ExchangeHostedEdition.DeleteExchangeOrganization(PanelRequest.ItemID); - - if (result.IsSuccess) - { - // navigate to details - Response.Redirect(NavigateURL("SpaceID", PanelSecurity.PackageId.ToString())); - } - else - { - // display message - messageBox.ShowMessage(result, "EXCHANGE_HOSTED_DELETE_ORGANIZATION", "ExchangeHostedEdition"); - } - } - catch (Exception ex) - { - messageBox.ShowErrorMessage("EXCHANGE_HOSTED_DELETE_ORGANIZATION", ex); - } - } - - protected void cancel_Click(object sender, EventArgs e) - { - Response.Redirect(NavigateURL("SpaceID", PanelSecurity.PackageId.ToString(), "ItemID=" + PanelRequest.ItemID.ToString())); - } - } -} \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeHostedEdition/DeleteOrganization.ascx.designer.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeHostedEdition/DeleteOrganization.ascx.designer.cs deleted file mode 100644 index 880d371f..00000000 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeHostedEdition/DeleteOrganization.ascx.designer.cs +++ /dev/null @@ -1,69 +0,0 @@ -//------------------------------------------------------------------------------ -// -// This code was generated by a tool. -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -//------------------------------------------------------------------------------ - -namespace WebsitePanel.Portal.ExchangeHostedEdition { - - - public partial class DeleteOrganization { - - /// - /// asyncTasks control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::WebsitePanel.Portal.EnableAsyncTasksSupport asyncTasks; - - /// - /// messageBox control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::WebsitePanel.Portal.UserControls.SimpleMessageBox messageBox; - - /// - /// locWarningMessage control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.Localize locWarningMessage; - - /// - /// confirmDelete control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.CheckBox confirmDelete; - - /// - /// delete control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.Button delete; - - /// - /// cancel control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.Button cancel; - } -} diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeHostedEdition/OrganizationDetails.ascx b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeHostedEdition/OrganizationDetails.ascx deleted file mode 100644 index b8dc32c6..00000000 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeHostedEdition/OrganizationDetails.ascx +++ /dev/null @@ -1,166 +0,0 @@ -<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="OrganizationDetails.ascx.cs" Inherits="WebsitePanel.Portal.ExchangeHostedEdition.OrganizationDetails" %> -<%@ Register Src="../UserControls/QuotaViewer.ascx" TagName="QuotaViewer" TagPrefix="wsp" %> -<%@ Register Src="../UserControls/SimpleMessageBox.ascx" TagName="SimpleMessageBox" TagPrefix="wsp" %> -<%@ Register Src="../UserControls/EnableAsyncTasksSupport.ascx" TagName="EnableAsyncTasksSupport" TagPrefix="wsp" %> - - - -
- -
- Organization Details - - - - - - - - - - - - - - - - - -
Organization name:
Administrator name:
Administrator e-mail:
Exchange Control Panel:
-
- -
-
- -
- Service Plan - - - - - - - - - - - - - - -
Service:
Program ID:
Offer ID:
- -
- -
-
- Visible to admins only -
-
- -
- Quotas - - - - - - - - - - - - - -
Mailboxes:0 of 0 (max 0)
Contacts:0 of 0 (max 0)
Distribution Lists:0 of 0 (max 0)
-
- -
-
- -
- Domains -
- -
- - - - - - - <%# Eval("Name") %> - - - - -
-   - -
-
-
- - -
-   - -
-
-
- - -   - - -
-
-
- -     - -
- - <%-- -
- Catch-all - - - - - -
Catch-all address:(not set)
-
- -
-
- --%> - -
- Setup Instructions -
- (not set) -
-
- - - - -
-
-
\ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeHostedEdition/OrganizationDetails.ascx.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeHostedEdition/OrganizationDetails.ascx.cs deleted file mode 100644 index 089d2bf0..00000000 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeHostedEdition/OrganizationDetails.ascx.cs +++ /dev/null @@ -1,211 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Web; -using System.Web.UI; -using System.Web.UI.WebControls; -using WebsitePanel.Providers.Common; -using WebsitePanel.Providers.ExchangeHostedEdition; - -namespace WebsitePanel.Portal.ExchangeHostedEdition -{ - public partial class OrganizationDetails : WebsitePanelModuleBase - { - private int ItemID - { - get { return (ViewState["ItemID"] != null) ? (int)ViewState["ItemID"] : 0; } - set { ViewState["ItemID"] = value; } - } - - protected void Page_Load(object sender, EventArgs e) - { - // get organization details - ExchangeOrganization[] orgs = ES.Services.ExchangeHostedEdition.GetOrganizations(PanelSecurity.PackageId); - - if (orgs.Length == 0) - { - // create a new organization - Response.Redirect(EditUrl("SpaceID", PanelSecurity.PackageId.ToString(), "create_org")); - return; - } - else - { - // bind - if(!IsPostBack) - BindOrganization(orgs[0].Id); - } - } - - private void BindOrganization(int itemId) - { - // load organization details - ExchangeOrganization org = null; - try - { - org = ES.Services.ExchangeHostedEdition.GetExchangeOrganizationDetails(itemId); - if (org == null) - throw new ArgumentNullException("Organization not found"); - } - catch (Exception ex) - { - messageBox.ShowErrorMessage("EXCHANGE_HOSTED_GET_ORGANIZATION", ex); - return; - } - - // basic details - ItemID = org.Id; - organizationName.Text = org.Name; - administratorName.Text = org.AdministratorName; - administratorEmail.Text = org.AdministratorEmail; - ecpURL.Text = org.ExchangeControlPanelUrl; - ecpURL.NavigateUrl = org.ExchangeControlPanelUrl; - - // service plan - serviceName.Text = org.ServicePlan; - programID.Text = org.ProgramId; - offerID.Text = org.OfferId; - servicePlanBlock.Visible = (PanelSecurity.LoggedUser.Role == EnterpriseServer.UserRole.Administrator); - - // quotas - string quotaFormat = GetLocalizedString("quota.FormatText"); - mailboxes.Text = String.Format(quotaFormat, org.MailboxCount, FormatUnlimited(org.MailboxCountQuota), FormatUnlimited(org.MaxMailboxCountQuota)); - contacts.Text = String.Format(quotaFormat, org.ContactCount, FormatUnlimited(org.ContactCountQuota), FormatUnlimited(org.MaxContactCountQuota)); - distributionLists.Text = String.Format(quotaFormat, org.DistributionListCount, FormatUnlimited(org.DistributionListCountQuota), FormatUnlimited(org.MaxDistributionListCountQuota)); - - - // catch-all - //catchAllAddress.Text = !String.IsNullOrEmpty(org.CatchAllAddress) ? org.CatchAllAddress : GetLocalizedString("catchAllNotSet.Text"); - - // domains - BindOrganizationDomains(org); - - // summary - BindOrganizationSummary(org); - } - - private string FormatUnlimited(int num) - { - return (num != -1) ? num.ToString() : GetLocalizedString("unlimited.Text"); - } - - private void BindOrganizationDomains(ExchangeOrganization org) - { - try - { - // bind grid - gvDomains.DataSource = org.Domains; - gvDomains.DataBind(); - - // set gauge - domainsQuota.QuotaValue = org.MaxDomainsCountQuota; - domainsQuota.QuotaUsedValue = org.Domains.Length; - } - catch (Exception ex) - { - messageBox.ShowErrorMessage("EXCHANGE_HOSTED_GET_DOMAINS", ex); - return; - } - } - - private void BindOrganizationSummary(ExchangeOrganization org) - { - try - { - string summaryText = ES.Services.ExchangeHostedEdition.GetExchangeOrganizationSummary(org.Id); - setupInstructions.Text = !String.IsNullOrEmpty(summaryText) ? summaryText : GetLocalizedString("summaryTemplateNotSet.Text"); - - // hide block if template is not set - organizationSummary.Visible = !String.IsNullOrEmpty(summaryText) || (PanelSecurity.LoggedUser.Role != EnterpriseServer.UserRole.User); - } - catch (Exception ex) - { - messageBox.ShowErrorMessage("EXCHANGE_HOSTED_GET_DOMAINS", ex); - return; - } - } - - protected void gvDomains_RowDeleting(object sender, GridViewDeleteEventArgs e) - { - // delete domain - DeleteDomain(gvDomains.DataKeys[e.RowIndex][0].ToString()); - - // cancel event - e.Cancel = true; - } - - private void DeleteDomain(string domainName) - { - try - { - // call service - ResultObject result = ES.Services.ExchangeHostedEdition.DeleteExchangeOrganizationDomain(ItemID, domainName); - - // check results - if (result.IsSuccess) - { - // refresh details - BindOrganization(ItemID); - } - else - { - // display message - messageBox.ShowMessage(result, "EXCHANGE_HOSTED_DELETE_DOMAIN", "ExchangeHostedEdition"); - } - } - catch (Exception ex) - { - messageBox.ShowErrorMessage("EXCHANGE_HOSTED_DELETE_DOMAIN", ex); - } - } - - protected void deleteOrganization_Click(object sender, EventArgs e) - { - Response.Redirect(EditUrl("ItemID", ItemID.ToString(), "delete_org", "SpaceID=" + PanelSecurity.PackageId.ToString())); - } - - protected void changeServicePlan_Click(object sender, EventArgs e) - { - Response.Redirect(EditUrl("ItemID", ItemID.ToString(), "update_org_plan", "SpaceID=" + PanelSecurity.PackageId.ToString())); - } - - protected void updateQuotas_Click(object sender, EventArgs e) - { - Response.Redirect(EditUrl("ItemID", ItemID.ToString(), "update_org_quotas", "SpaceID=" + PanelSecurity.PackageId.ToString())); - } - - protected void btnAddDomain_Click(object sender, EventArgs e) - { - Response.Redirect(EditUrl("ItemID", ItemID.ToString(), "add_org_domain", "SpaceID=" + PanelSecurity.PackageId.ToString())); - } - - protected void setCatchAll_Click(object sender, EventArgs e) - { - Response.Redirect(EditUrl("ItemID", ItemID.ToString(), "update_org_catchall", "SpaceID=" + PanelSecurity.PackageId.ToString())); - } - - protected void sendSetupInstructions_Click(object sender, EventArgs e) - { - if (!Page.IsValid) - return; - - try - { - ResultObject result = ES.Services.ExchangeHostedEdition.SendExchangeOrganizationSummary(ItemID, sendTo.Text.Trim()); - - if (result.IsSuccess) - { - // display success message - messageBox.ShowSuccessMessage("EXCHANGE_HOSTED_SEND_SUMMARY"); - } - else - { - // display error message - messageBox.ShowMessage(result, "EXCHANGE_HOSTED_SEND_SUMMARY", "ExchangeHostedEdition"); - } - } - catch (Exception ex) - { - messageBox.ShowErrorMessage("EXCHANGE_HOSTED_SEND_SUMMARY", ex); - } - } - } -} \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeHostedEdition/OrganizationDetails.ascx.designer.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeHostedEdition/OrganizationDetails.ascx.designer.cs deleted file mode 100644 index 9c330d65..00000000 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeHostedEdition/OrganizationDetails.ascx.designer.cs +++ /dev/null @@ -1,393 +0,0 @@ -//------------------------------------------------------------------------------ -// -// This code was generated by a tool. -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -//------------------------------------------------------------------------------ - -namespace WebsitePanel.Portal.ExchangeHostedEdition { - - - public partial class OrganizationDetails { - - /// - /// asyncTasks control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::WebsitePanel.Portal.EnableAsyncTasksSupport asyncTasks; - - /// - /// messageBox control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::WebsitePanel.Portal.UserControls.SimpleMessageBox messageBox; - - /// - /// locOrganizationDetails control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.Localize locOrganizationDetails; - - /// - /// locOrganizationName control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.Localize locOrganizationName; - - /// - /// organizationName control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.Literal organizationName; - - /// - /// locAdministratorName control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.Localize locAdministratorName; - - /// - /// administratorName control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.Literal administratorName; - - /// - /// locAdministratorEmail control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.Localize locAdministratorEmail; - - /// - /// administratorEmail control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.Literal administratorEmail; - - /// - /// locEcpURL control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.Localize locEcpURL; - - /// - /// ecpURL control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.HyperLink ecpURL; - - /// - /// deleteOrganization control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.Button deleteOrganization; - - /// - /// servicePlanBlock control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.HtmlControls.HtmlGenericControl servicePlanBlock; - - /// - /// locServicePlan control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.Localize locServicePlan; - - /// - /// locService control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.Localize locService; - - /// - /// serviceName control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.Literal serviceName; - - /// - /// locProgramID control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.Localize locProgramID; - - /// - /// programID control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.Literal programID; - - /// - /// locOfferID control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.Localize locOfferID; - - /// - /// offerID control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.Literal offerID; - - /// - /// changeServicePlan control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.Button changeServicePlan; - - /// - /// lblAdminsWarning control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.Label lblAdminsWarning; - - /// - /// locQuotas control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.Localize locQuotas; - - /// - /// locMailboxes control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.Localize locMailboxes; - - /// - /// mailboxes control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.Literal mailboxes; - - /// - /// locContacts control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.Localize locContacts; - - /// - /// contacts control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.Literal contacts; - - /// - /// locDistributionLists control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.Localize locDistributionLists; - - /// - /// distributionLists control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.Literal distributionLists; - - /// - /// updateQuotas control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.Button updateQuotas; - - /// - /// locDomains control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.Localize locDomains; - - /// - /// btnAddDomain control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.Button btnAddDomain; - - /// - /// gvDomains control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.GridView gvDomains; - - /// - /// locDomainsQuota control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.Localize locDomainsQuota; - - /// - /// domainsQuota control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::WebsitePanel.Portal.QuotaViewer domainsQuota; - - /// - /// organizationSummary control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.HtmlControls.HtmlGenericControl organizationSummary; - - /// - /// locSetupInstructions control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.Localize locSetupInstructions; - - /// - /// setupInstructions control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.Literal setupInstructions; - - /// - /// locSendTo control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.Localize locSendTo; - - /// - /// sendTo control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.TextBox sendTo; - - /// - /// sendSetupInstructions control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.Button sendSetupInstructions; - - /// - /// requireSendTo control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.RequiredFieldValidator requireSendTo; - } -} diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeHostedEdition/UpdateOrganizationCatchAll.ascx b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeHostedEdition/UpdateOrganizationCatchAll.ascx deleted file mode 100644 index e822eb26..00000000 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeHostedEdition/UpdateOrganizationCatchAll.ascx +++ /dev/null @@ -1,44 +0,0 @@ -<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="UpdateOrganizationCatchAll.ascx.cs" Inherits="WebsitePanel.Portal.ExchangeHostedEdition.UpdateOrganizationCatchAll" %> -<%@ Register Src="../UserControls/SimpleMessageBox.ascx" TagName="SimpleMessageBox" TagPrefix="wsp" %> -<%@ Register Src="../UserControls/EnableAsyncTasksSupport.ascx" TagName="EnableAsyncTasksSupport" TagPrefix="wsp" %> - - - -
- - - - - - - - - - - -
- - - - -
-
Catch-all mailbox: - - - - @ - - -
-
-
- - -
\ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeHostedEdition/UpdateOrganizationCatchAll.ascx.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeHostedEdition/UpdateOrganizationCatchAll.ascx.cs deleted file mode 100644 index e5dddcb5..00000000 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeHostedEdition/UpdateOrganizationCatchAll.ascx.cs +++ /dev/null @@ -1,108 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Web; -using System.Web.UI; -using System.Web.UI.WebControls; -using WebsitePanel.Providers.Common; -using WebsitePanel.Providers.ExchangeHostedEdition; - -namespace WebsitePanel.Portal.ExchangeHostedEdition -{ - public partial class UpdateOrganizationCatchAll : WebsitePanelModuleBase - { - protected void Page_Load(object sender, EventArgs e) - { - if (!IsPostBack) - { - BindOrganizationDomains(); - BindCatchAllMode(); - } - } - - private void BindOrganizationDomains() - { - try - { - // read domains - ExchangeOrganizationDomain[] orgDomains = ES.Services.ExchangeHostedEdition.GetExchangeOrganizationDomains(PanelRequest.ItemID); - - // bind domains - domains.DataSource = orgDomains; - domains.DataBind(); - - // select default domain - foreach (ExchangeOrganizationDomain domain in orgDomains) - { - if (domain.IsDefault) - { - domains.SelectedValue = domain.Name; - break; - } - } - - // insert empty item in the beginning - domains.Items.Insert(0, new ListItem(GetLocalizedString("SelectDomain.Text"), "")); - } - catch (Exception ex) - { - messageBox.ShowErrorMessage("EXCHANGE_HOSTED_GET_DOMAINS", ex); - } - } - - private void BindCatchAllMode() - { - rawCatchAllAddress.Visible = (catchAllMode.SelectedIndex > 0); - } - - protected void update_Click(object sender, EventArgs e) - { - if (!Page.IsValid) - return; - - try - { - // collect form data - string catchAllEmail = catchAllAddress.Text.Trim() + "@" + domains.SelectedValue; - if (catchAllMode.SelectedIndex == 0) - { - catchAllEmail = ""; // disabled - } - - // call service - ResultObject result = ES.Services.ExchangeHostedEdition.UpdateExchangeOrganizationCatchAllAddress( - PanelRequest.ItemID, catchAllEmail); - - // check results - if (result.IsSuccess) - { - // navigate to details - RedirectBack(); - } - else - { - // display message - messageBox.ShowMessage(result, "EXCHANGE_HOSTED_CHANGE_QUOTAS", "ExchangeHostedEdition"); - } - } - catch (Exception ex) - { - messageBox.ShowErrorMessage("EXCHANGE_HOSTED_CHANGE_QUOTAS", ex); - } - } - - protected void cancel_Click(object sender, EventArgs e) - { - RedirectBack(); - } - - private void RedirectBack() - { - Response.Redirect(NavigateURL("SpaceID", PanelSecurity.PackageId.ToString(), "ItemID=" + PanelRequest.ItemID.ToString())); - } - - protected void catchAllMode_SelectedIndexChanged(object sender, EventArgs e) - { - BindCatchAllMode(); - } - } -} \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeHostedEdition/UpdateOrganizationCatchAll.ascx.designer.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeHostedEdition/UpdateOrganizationCatchAll.ascx.designer.cs deleted file mode 100644 index 6bb1db1d..00000000 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeHostedEdition/UpdateOrganizationCatchAll.ascx.designer.cs +++ /dev/null @@ -1,132 +0,0 @@ -//------------------------------------------------------------------------------ -// -// This code was generated by a tool. -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -//------------------------------------------------------------------------------ - -namespace WebsitePanel.Portal.ExchangeHostedEdition { - - - public partial class UpdateOrganizationCatchAll { - - /// - /// asyncTasks control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::WebsitePanel.Portal.EnableAsyncTasksSupport asyncTasks; - - /// - /// messageBox control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::WebsitePanel.Portal.UserControls.SimpleMessageBox messageBox; - - /// - /// validationErrors control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.ValidationSummary validationErrors; - - /// - /// catchAllMode control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.RadioButtonList catchAllMode; - - /// - /// rawCatchAllAddress control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.HtmlControls.HtmlTableRow rawCatchAllAddress; - - /// - /// locCatchAllAddress control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.Localize locCatchAllAddress; - - /// - /// catchAllAddress control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.TextBox catchAllAddress; - - /// - /// requireCatchAllAddress control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.RequiredFieldValidator requireCatchAllAddress; - - /// - /// requireCorrectEmail control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.RegularExpressionValidator requireCorrectEmail; - - /// - /// domains control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.DropDownList domains; - - /// - /// requireDomain control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.RequiredFieldValidator requireDomain; - - /// - /// update control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.Button update; - - /// - /// cancel control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.Button cancel; - } -} diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeHostedEdition/UpdateOrganizationQuotas.ascx b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeHostedEdition/UpdateOrganizationQuotas.ascx deleted file mode 100644 index 9c4fde3d..00000000 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeHostedEdition/UpdateOrganizationQuotas.ascx +++ /dev/null @@ -1,52 +0,0 @@ -<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="UpdateOrganizationQuotas.ascx.cs" Inherits="WebsitePanel.Portal.ExchangeHostedEdition.UpdateOrganizationQuotas" %> -<%@ Register Src="../UserControls/SimpleMessageBox.ascx" TagName="SimpleMessageBox" TagPrefix="wsp" %> -<%@ Register Src="../UserControls/EnableAsyncTasksSupport.ascx" TagName="EnableAsyncTasksSupport" TagPrefix="wsp" %> - - - -
- - - - - - - - - - - - - - - - -
- - (max 0) - - -
- - (max 0) - - -
- - (max 0) - - -
-
-
- - -
\ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeHostedEdition/UpdateOrganizationQuotas.ascx.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeHostedEdition/UpdateOrganizationQuotas.ascx.cs deleted file mode 100644 index 8c0cddcb..00000000 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeHostedEdition/UpdateOrganizationQuotas.ascx.cs +++ /dev/null @@ -1,121 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Web; -using System.Web.UI; -using System.Web.UI.WebControls; -using WebsitePanel.Providers.Common; -using WebsitePanel.Providers.ExchangeHostedEdition; - -namespace WebsitePanel.Portal.ExchangeHostedEdition -{ - public partial class UpdateOrganizationQuotas : WebsitePanelModuleBase - { - protected void Page_Load(object sender, EventArgs e) - { - if (!IsPostBack) - { - BindOrganizationQuotas(); - } - } - - private void BindOrganizationQuotas() - { - // load organization details - ExchangeOrganization org = null; - try - { - org = ES.Services.ExchangeHostedEdition.GetExchangeOrganizationDetails(PanelRequest.ItemID); - if (org == null) - throw new ArgumentNullException("Organization not found"); - } - catch (Exception ex) - { - messageBox.ShowErrorMessage("EXCHANGE_HOSTED_GET_ORGANIZATION", ex); - return; - } - - // current quotas - mailboxes.Text = IsUnlimited(org.MailboxCountQuota) ? "" : org.MailboxCountQuota.ToString(); - contacts.Text = IsUnlimited(org.ContactCountQuota) ? "" : org.ContactCountQuota.ToString(); - distributionLists.Text = IsUnlimited(org.DistributionListCountQuota) ? "" : org.DistributionListCountQuota.ToString(); - - // max quotas - string maxQuotaFormat = GetLocalizedString("maxQuota.Text"); - maxMailboxes.Text = String.Format(maxQuotaFormat, FormatUnlimited(org.MaxMailboxCountQuota)); - maxContacts.Text = String.Format(maxQuotaFormat, FormatUnlimited(org.MaxContactCountQuota)); - maxDistributionLists.Text = String.Format(maxQuotaFormat, FormatUnlimited(org.MaxDistributionListCountQuota)); - - if (!IsUnlimited(org.MaxMailboxCountQuota)) - { - requireMailboxes.Enabled = true; - rangeMailboxes.MaximumValue = org.MaxMailboxCountQuota.ToString(); - } - - if (!IsUnlimited(org.MaxContactCountQuota)) - { - requireContacts.Enabled = true; - rangeContacts.MaximumValue = org.MaxContactCountQuota.ToString(); - } - - if (!IsUnlimited(org.MaxDistributionListCountQuota)) - { - requireDistributionLists.Enabled = true; - rangeDistributionLists.MaximumValue = org.MaxDistributionListCountQuota.ToString(); - } - } - - private bool IsUnlimited(int num) - { - return (num == -1); - } - - private string FormatUnlimited(int num) - { - return IsUnlimited(num) ? GetLocalizedString("unlimited.Text") : num.ToString(); - } - - protected void update_Click(object sender, EventArgs e) - { - if (!Page.IsValid) - return; - - try - { - // collect form data - int mailboxesNumber = (mailboxes.Text.Trim() == "") ? -1 : Utils.ParseInt(mailboxes.Text, 0); - int contactsNumber = (contacts.Text.Trim() == "") ? -1 : Utils.ParseInt(contacts.Text, 0); - int distributionListsNumber = (distributionLists.Text.Trim() == "") ? -1 : Utils.ParseInt(distributionLists.Text, 0); - - // call service - ResultObject result = ES.Services.ExchangeHostedEdition.UpdateExchangeOrganizationQuotas( - PanelRequest.ItemID, mailboxesNumber, contactsNumber, distributionListsNumber); - - // check results - if (result.IsSuccess) - { - // navigate to details - RedirectBack(); - } - else - { - // display message - messageBox.ShowMessage(result, "EXCHANGE_HOSTED_CHANGE_QUOTAS", "ExchangeHostedEdition"); - } - } - catch (Exception ex) - { - messageBox.ShowErrorMessage("EXCHANGE_HOSTED_CHANGE_QUOTAS", ex); - } - } - - protected void cancel_Click(object sender, EventArgs e) - { - RedirectBack(); - } - - private void RedirectBack() - { - Response.Redirect(NavigateURL("SpaceID", PanelSecurity.PackageId.ToString(), "ItemID=" + PanelRequest.ItemID.ToString())); - } - } -} \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeHostedEdition/UpdateOrganizationQuotas.ascx.designer.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeHostedEdition/UpdateOrganizationQuotas.ascx.designer.cs deleted file mode 100644 index af229361..00000000 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeHostedEdition/UpdateOrganizationQuotas.ascx.designer.cs +++ /dev/null @@ -1,195 +0,0 @@ -//------------------------------------------------------------------------------ -// -// This code was generated by a tool. -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -//------------------------------------------------------------------------------ - -namespace WebsitePanel.Portal.ExchangeHostedEdition { - - - public partial class UpdateOrganizationQuotas { - - /// - /// asyncTasks control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::WebsitePanel.Portal.EnableAsyncTasksSupport asyncTasks; - - /// - /// messageBox control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::WebsitePanel.Portal.UserControls.SimpleMessageBox messageBox; - - /// - /// validationErrors control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.ValidationSummary validationErrors; - - /// - /// locMailboxes control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.Localize locMailboxes; - - /// - /// mailboxes control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.TextBox mailboxes; - - /// - /// maxMailboxes control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.Literal maxMailboxes; - - /// - /// requireMailboxes control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.RequiredFieldValidator requireMailboxes; - - /// - /// rangeMailboxes control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.RangeValidator rangeMailboxes; - - /// - /// locContacts control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.Localize locContacts; - - /// - /// contacts control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.TextBox contacts; - - /// - /// maxContacts control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.Literal maxContacts; - - /// - /// requireContacts control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.RequiredFieldValidator requireContacts; - - /// - /// rangeContacts control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.RangeValidator rangeContacts; - - /// - /// locDistributionLists control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.Localize locDistributionLists; - - /// - /// distributionLists control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.TextBox distributionLists; - - /// - /// maxDistributionLists control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.Literal maxDistributionLists; - - /// - /// requireDistributionLists control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.RequiredFieldValidator requireDistributionLists; - - /// - /// rangeDistributionLists control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.RangeValidator rangeDistributionLists; - - /// - /// update control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.Button update; - - /// - /// cancel control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.Button cancel; - } -} diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeHostedEdition/UpdateOrganizationServicePlan.ascx b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeHostedEdition/UpdateOrganizationServicePlan.ascx deleted file mode 100644 index 56404805..00000000 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeHostedEdition/UpdateOrganizationServicePlan.ascx +++ /dev/null @@ -1,58 +0,0 @@ -<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="UpdateOrganizationServicePlan.ascx.cs" Inherits="WebsitePanel.Portal.ExchangeHostedEdition.UpdateOrganizationServicePlan" %> -<%@ Register Src="../UserControls/SimpleMessageBox.ascx" TagName="SimpleMessageBox" TagPrefix="wsp" %> -<%@ Register Src="../UserControls/EnableAsyncTasksSupport.ascx" TagName="EnableAsyncTasksSupport" TagPrefix="wsp" %> - - - -
- - - -
- - - - - - - - - - - - - - -
-
- -
- - - - - - - - - - - - - - -
- - -
-
-
-
- - -
\ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeHostedEdition/UpdateOrganizationServicePlan.ascx.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeHostedEdition/UpdateOrganizationServicePlan.ascx.cs deleted file mode 100644 index 2e44f2c3..00000000 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeHostedEdition/UpdateOrganizationServicePlan.ascx.cs +++ /dev/null @@ -1,121 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Web; -using System.Web.UI; -using System.Web.UI.WebControls; -using WebsitePanel.Providers.Common; -using WebsitePanel.EnterpriseServer; -using WebsitePanel.Providers.ExchangeHostedEdition; - -namespace WebsitePanel.Portal.ExchangeHostedEdition -{ - public partial class UpdateOrganizationServicePlan : WebsitePanelModuleBase - { - protected void Page_Load(object sender, EventArgs e) - { - if (!IsPostBack) - { - BindServices(); - BindOrganizationDetails(); - } - } - - private void BindServices() - { - // bind - services.DataSource = ES.Services.Servers.GetRawServicesByGroupName(ResourceGroups.ExchangeHostedEdition).Tables[0].DefaultView; - services.DataBind(); - - // insert empty item - services.Items.Insert(0, new ListItem(GetLocalizedString("SelectService.Text"), "")); - } - - private void BindOrganizationDetails() - { - ExchangeOrganization org = ES.Services.ExchangeHostedEdition.GetExchangeOrganizationDetails(PanelRequest.ItemID); - if (org == null) - return; - - // selected service - ListItem sourceItem = null; - foreach (ListItem item in services.Items) - { - if (item.Value == org.ServiceId.ToString()) - { - sourceItem = item; - currentServiceName.Text = item.Text; - break; - } - } - - if (sourceItem != null) - services.Items.Remove(sourceItem); - - currentProgramID.Text = org.ProgramId; - currentOfferID.Text = org.OfferId; - } - - private void BindSelectedService() - { - int newServiceId = Utils.ParseInt(services.SelectedValue, 0); - - // get service settings - string[] settings = ES.Services.Servers.GetServiceSettings(newServiceId); - - foreach (string setting in settings) - { - string[] pair = setting.Split('='); - if(String.Equals(pair[0], "ProgramID", StringComparison.InvariantCultureIgnoreCase)) - newProgramID.Text = pair[1]; - else if (String.Equals(pair[0], "OfferID", StringComparison.InvariantCultureIgnoreCase)) - newOfferID.Text = pair[1]; - } - } - - protected void services_SelectedIndexChanged(object sender, EventArgs e) - { - BindSelectedService(); - } - - protected void apply_Click(object sender, EventArgs e) - { - if (!Page.IsValid) - return; - - try - { - // collect form data - int serviceId = Utils.ParseInt(services.SelectedValue, 0); - - // call service - ResultObject result = ES.Services.ExchangeHostedEdition.UpdateExchangeOrganizationServicePlan(PanelRequest.ItemID, serviceId); - - // check results - if (result.IsSuccess) - { - // navigate to details - RedirectBack(); - } - else - { - // display message - messageBox.ShowMessage(result, "EXCHANGE_HOSTED_CHANGE_SERVICE_PLAN", "ExchangeHostedEdition"); - } - } - catch (Exception ex) - { - messageBox.ShowErrorMessage("EXCHANGE_HOSTED_CHANGE_SERVICE_PLAN", ex); - } - } - - protected void cancel_Click(object sender, EventArgs e) - { - RedirectBack(); - } - - private void RedirectBack() - { - Response.Redirect(NavigateURL("SpaceID", PanelSecurity.PackageId.ToString(), "ItemID=" + PanelRequest.ItemID.ToString())); - } - } -} \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeHostedEdition/UpdateOrganizationServicePlan.ascx.designer.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeHostedEdition/UpdateOrganizationServicePlan.ascx.designer.cs deleted file mode 100644 index d71d149c..00000000 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeHostedEdition/UpdateOrganizationServicePlan.ascx.designer.cs +++ /dev/null @@ -1,195 +0,0 @@ -//------------------------------------------------------------------------------ -// -// This code was generated by a tool. -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -//------------------------------------------------------------------------------ - -namespace WebsitePanel.Portal.ExchangeHostedEdition { - - - public partial class UpdateOrganizationServicePlan { - - /// - /// asyncTasks control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::WebsitePanel.Portal.EnableAsyncTasksSupport asyncTasks; - - /// - /// messageBox control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::WebsitePanel.Portal.UserControls.SimpleMessageBox messageBox; - - /// - /// validationErrors control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.ValidationSummary validationErrors; - - /// - /// locCurrentServicePlan control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.Localize locCurrentServicePlan; - - /// - /// locCurrentService control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.Localize locCurrentService; - - /// - /// currentServiceName control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.Literal currentServiceName; - - /// - /// locCurrentProgramID control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.Localize locCurrentProgramID; - - /// - /// currentProgramID control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.Literal currentProgramID; - - /// - /// locCurrentOfferID control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.Localize locCurrentOfferID; - - /// - /// currentOfferID control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.Literal currentOfferID; - - /// - /// locNewServicePlan control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.Localize locNewServicePlan; - - /// - /// locNewService control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.Localize locNewService; - - /// - /// services control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.DropDownList services; - - /// - /// requireServices control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.RequiredFieldValidator requireServices; - - /// - /// locNewProgramID control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.Localize locNewProgramID; - - /// - /// newProgramID control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.Literal newProgramID; - - /// - /// locNewOfferID control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.Localize locNewOfferID; - - /// - /// newOfferID control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.Literal newOfferID; - - /// - /// apply control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.Button apply; - - /// - /// cancel control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.Button cancel; - } -} diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/SettingsExchangeHostedEditionOrganizationSummary.ascx b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/SettingsExchangeHostedEditionOrganizationSummary.ascx deleted file mode 100644 index cd30d27b..00000000 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/SettingsExchangeHostedEditionOrganizationSummary.ascx +++ /dev/null @@ -1,42 +0,0 @@ -<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="SettingsExchangeHostedEditionOrganizationSummary.ascx.cs" Inherits="WebsitePanel.Portal.SettingsExchangeHostedEditionOrganizationSummary" %> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
-
-
- - High - Normal - Low - -


-


-
\ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/SettingsExchangeHostedEditionOrganizationSummary.ascx.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/SettingsExchangeHostedEditionOrganizationSummary.ascx.cs deleted file mode 100644 index f434206d..00000000 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/SettingsExchangeHostedEditionOrganizationSummary.ascx.cs +++ /dev/null @@ -1,67 +0,0 @@ -// Copyright (c) 2012, Outercurve Foundation. -// All rights reserved. -// -// Redistribution and use in source and binary forms, with or without modification, -// are permitted provided that the following conditions are met: -// -// - Redistributions of source code must retain the above copyright notice, this -// list of conditions and the following disclaimer. -// -// - Redistributions in binary form must reproduce the above copyright notice, -// this list of conditions and the following disclaimer in the documentation -// and/or other materials provided with the distribution. -// -// - Neither the name of the Outercurve Foundation nor the names of its -// contributors may be used to endorse or promote products derived from this -// software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR -// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON -// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - -using System; -using System.Data; -using System.Configuration; -using System.Collections; -using System.Web; -using System.Web.Security; -using System.Web.UI; -using System.Web.UI.WebControls; -using System.Web.UI.WebControls.WebParts; -using System.Web.UI.HtmlControls; - -using WebsitePanel.EnterpriseServer; - -namespace WebsitePanel.Portal -{ - public partial class SettingsExchangeHostedEditionOrganizationSummary : WebsitePanelControlBase, IUserSettingsEditorControl - { - public void BindSettings(UserSettings settings) - { - txtFrom.Text = settings["From"]; - txtCC.Text = settings["CC"]; - txtSubject.Text = settings["Subject"]; - Utils.SelectListItem(ddlPriority, settings["Priority"]); - txtHtmlBody.Text = settings["HtmlBody"]; - txtTextBody.Text = settings["TextBody"]; - } - - public void SaveSettings(UserSettings settings) - { - settings["From"] = txtFrom.Text; - settings["CC"] = txtCC.Text; - settings["Subject"] = txtSubject.Text; - settings["Priority"] = ddlPriority.SelectedValue; - settings["HtmlBody"] = txtHtmlBody.Text; - settings["TextBody"] = txtTextBody.Text; - } - } -} \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/SettingsExchangeHostedEditionOrganizationSummary.ascx.designer.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/SettingsExchangeHostedEditionOrganizationSummary.ascx.designer.cs deleted file mode 100644 index 605a8733..00000000 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/SettingsExchangeHostedEditionOrganizationSummary.ascx.designer.cs +++ /dev/null @@ -1,123 +0,0 @@ -//------------------------------------------------------------------------------ -// -// This code was generated by a tool. -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -//------------------------------------------------------------------------------ - -namespace WebsitePanel.Portal { - - - public partial class SettingsExchangeHostedEditionOrganizationSummary { - - /// - /// lblFrom control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.Label lblFrom; - - /// - /// txtFrom control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.TextBox txtFrom; - - /// - /// lblCC control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.Label lblCC; - - /// - /// txtCC control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.TextBox txtCC; - - /// - /// lblSubject control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.Label lblSubject; - - /// - /// txtSubject control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.TextBox txtSubject; - - /// - /// lblPriority control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.Label lblPriority; - - /// - /// ddlPriority control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.DropDownList ddlPriority; - - /// - /// lblHtmlBody control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.Label lblHtmlBody; - - /// - /// txtHtmlBody control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.TextBox txtHtmlBody; - - /// - /// lblTextBody control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.Label lblTextBody; - - /// - /// txtTextBody control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.TextBox txtTextBody; - } -} diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/SettingsExchangeHostedEditionPolicy.ascx b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/SettingsExchangeHostedEditionPolicy.ascx deleted file mode 100644 index a0d6e374..00000000 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/SettingsExchangeHostedEditionPolicy.ascx +++ /dev/null @@ -1,18 +0,0 @@ -<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="SettingsExchangeHostedEditionPolicy.ascx.cs" Inherits="WebsitePanel.Portal.SettingsExchangeHostedEditionPolicy" %> -<%@ Register Src="UserControls/PasswordPolicyEditor.ascx" TagName="PasswordPolicyEditor" TagPrefix="wsp" %> -<%@ Register TagPrefix="wsp" TagName="CollapsiblePanel" Src="UserControls/CollapsiblePanel.ascx" %> - - - - - - - - -
- - - -
-
\ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/SettingsExchangeHostedEditionPolicy.ascx.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/SettingsExchangeHostedEditionPolicy.ascx.cs deleted file mode 100644 index f0621cf4..00000000 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/SettingsExchangeHostedEditionPolicy.ascx.cs +++ /dev/null @@ -1,58 +0,0 @@ -// Copyright (c) 2012, Outercurve Foundation. -// All rights reserved. -// -// Redistribution and use in source and binary forms, with or without modification, -// are permitted provided that the following conditions are met: -// -// - Redistributions of source code must retain the above copyright notice, this -// list of conditions and the following disclaimer. -// -// - Redistributions in binary form must reproduce the above copyright notice, -// this list of conditions and the following disclaimer in the documentation -// and/or other materials provided with the distribution. -// -// - Neither the name of the Outercurve Foundation nor the names of its -// contributors may be used to endorse or promote products derived from this -// software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR -// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON -// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -using System; -using System.Data; -using System.Configuration; -using System.Collections; -using System.Web; -using System.Web.Security; -using System.Web.UI; -using System.Web.UI.WebControls; -using System.Web.UI.WebControls.WebParts; -using System.Web.UI.HtmlControls; - -using WebsitePanel.EnterpriseServer; - -namespace WebsitePanel.Portal -{ - public partial class SettingsExchangeHostedEditionPolicy : WebsitePanelControlBase, IUserSettingsEditorControl - { - public void BindSettings(UserSettings settings) - { - // mailbox - mailboxPasswordPolicy.Value = settings["MailboxPasswordPolicy"]; - } - - public void SaveSettings(UserSettings settings) - { - // mailbox - settings["MailboxPasswordPolicy"] = mailboxPasswordPolicy.Value; - } - } -} \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/SettingsExchangeHostedEditionPolicy.ascx.designer.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/SettingsExchangeHostedEditionPolicy.ascx.designer.cs deleted file mode 100644 index 1653b06c..00000000 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/SettingsExchangeHostedEditionPolicy.ascx.designer.cs +++ /dev/null @@ -1,42 +0,0 @@ -//------------------------------------------------------------------------------ -// -// This code was generated by a tool. -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -//------------------------------------------------------------------------------ - -namespace WebsitePanel.Portal { - - - public partial class SettingsExchangeHostedEditionPolicy { - - /// - /// secMailboxPassword control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::WebsitePanel.Portal.CollapsiblePanel secMailboxPassword; - - /// - /// MailboxPasswordPanel control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.Panel MailboxPasswordPanel; - - /// - /// mailboxPasswordPolicy control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::WebsitePanel.Portal.PasswordPolicyEditor mailboxPasswordPolicy; - } -} diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/SpaceSettings.ascx b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/SpaceSettings.ascx index a0ed1fa1..a93f67c0 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/SpaceSettings.ascx +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/SpaceSettings.ascx @@ -24,9 +24,6 @@ - diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/SpaceSettings.ascx.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/SpaceSettings.ascx.cs index b09f8fb4..8fd926ed 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/SpaceSettings.ascx.cs +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/SpaceSettings.ascx.cs @@ -59,8 +59,6 @@ namespace WebsitePanel.Portal "edit_settings", "SettingsName=ChildSpacesFolder", "SpaceID=" + PanelSecurity.PackageId.ToString()); lnkExchangeServer.NavigateUrl = EditUrl("SettingsControl", "SpaceSettingsExchangeServer", "edit_settings", "SettingsName=ExchangeServer", "SpaceID=" + PanelSecurity.PackageId.ToString()); - lnkExchangeHostedEdition.NavigateUrl = EditUrl("SettingsControl", "SpaceSettingsExchangeHostedEdition", - "edit_settings", "SettingsName=ExchangeHostedEdition", "SpaceID=" + PanelSecurity.PackageId.ToString()); lnkVps.NavigateUrl = EditUrl("SettingsControl", "SpaceSettingsVPS", "edit_settings", "SettingsName=VirtualPrivateServers", "SpaceID=" + PanelSecurity.PackageId.ToString()); lnkVpsForPC.NavigateUrl = EditUrl("SettingsControl", "SpaceSettingsVPSForPC", diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/SpaceSettings.ascx.designer.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/SpaceSettings.ascx.designer.cs index 6cf872b4..795ee993 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/SpaceSettings.ascx.designer.cs +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/SpaceSettings.ascx.designer.cs @@ -84,15 +84,6 @@ namespace WebsitePanel.Portal { ///
protected global::System.Web.UI.WebControls.HyperLink lnkExchangeServer; - /// - /// lnkExchangeHostedEdition control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.HyperLink lnkExchangeHostedEdition; - /// /// lnkVps control. /// diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/SpaceSettingsExchangeHostedEdition.ascx b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/SpaceSettingsExchangeHostedEdition.ascx deleted file mode 100644 index e58866ab..00000000 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/SpaceSettingsExchangeHostedEdition.ascx +++ /dev/null @@ -1,18 +0,0 @@ -<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="SpaceSettingsExchangeHostedEdition.ascx.cs" Inherits="WebsitePanel.Portal.SpaceSettingsExchangeHostedEdition" %> - -
- Domain Templates - - - - - - - - - -
Temporary domain:organization_domain.
ECP URL template: -
- You can use [DOMAIN_NAME] variable for organization default domain. -
-
\ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/SpaceSettingsExchangeHostedEdition.ascx.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/SpaceSettingsExchangeHostedEdition.ascx.cs deleted file mode 100644 index 77cbfbc8..00000000 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/SpaceSettingsExchangeHostedEdition.ascx.cs +++ /dev/null @@ -1,63 +0,0 @@ -// Copyright (c) 2012, Outercurve Foundation. -// All rights reserved. -// -// Redistribution and use in source and binary forms, with or without modification, -// are permitted provided that the following conditions are met: -// -// - Redistributions of source code must retain the above copyright notice, this -// list of conditions and the following disclaimer. -// -// - Redistributions in binary form must reproduce the above copyright notice, -// this list of conditions and the following disclaimer in the documentation -// and/or other materials provided with the distribution. -// -// - Neither the name of the Outercurve Foundation nor the names of its -// contributors may be used to endorse or promote products derived from this -// software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR -// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON -// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -using System; -using System.Data; -using System.Configuration; -using System.Collections; -using System.Web; -using System.Web.Security; -using System.Web.UI; -using System.Web.UI.WebControls; -using System.Web.UI.WebControls.WebParts; -using System.Web.UI.HtmlControls; - -using WebsitePanel.EnterpriseServer; - -namespace WebsitePanel.Portal -{ - public partial class SpaceSettingsExchangeHostedEdition : WebsitePanelControlBase, IPackageSettingsEditorControl - { - protected void Page_Load(object sender, EventArgs e) - { - - } - - public void BindSettings(PackageSettings settings) - { - temporaryDomain.Text = settings["temporaryDomain"]; - ecpURL.Text = settings["ecpURL"]; - } - - public void SaveSettings(PackageSettings settings) - { - settings["temporaryDomain"] = temporaryDomain.Text.Trim(); - settings["ecpURL"] = ecpURL.Text.Trim(); - } - } -} \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/SpaceSettingsExchangeHostedEdition.ascx.designer.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/SpaceSettingsExchangeHostedEdition.ascx.designer.cs deleted file mode 100644 index e6e8dd5e..00000000 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/SpaceSettingsExchangeHostedEdition.ascx.designer.cs +++ /dev/null @@ -1,69 +0,0 @@ -//------------------------------------------------------------------------------ -// -// This code was generated by a tool. -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -//------------------------------------------------------------------------------ - -namespace WebsitePanel.Portal { - - - public partial class SpaceSettingsExchangeHostedEdition { - - /// - /// locDomainTemplates control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.Localize locDomainTemplates; - - /// - /// locTemporaryDomain control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.Localize locTemporaryDomain; - - /// - /// temporaryDomain control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.TextBox temporaryDomain; - - /// - /// locEcpURL control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.Localize locEcpURL; - - /// - /// ecpURL control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.TextBox ecpURL; - - /// - /// locEcpURLDescr control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.Localize locEcpURLDescr; - } -} diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/UserAccountMailTemplateSettings.ascx b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/UserAccountMailTemplateSettings.ascx index 7f83cb56..12da225e 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/UserAccountMailTemplateSettings.ascx +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/UserAccountMailTemplateSettings.ascx @@ -26,10 +26,6 @@ -
  • - -
  • diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/UserAccountMailTemplateSettings.ascx.designer.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/UserAccountMailTemplateSettings.ascx.designer.cs index edb0f27d..f30b5556 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/UserAccountMailTemplateSettings.ascx.designer.cs +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/UserAccountMailTemplateSettings.ascx.designer.cs @@ -66,15 +66,6 @@ namespace WebsitePanel.Portal { /// protected global::System.Web.UI.WebControls.HyperLink HyperLink2; - /// - /// lnkExchangeHostedEditionOrganizationSummary control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.HyperLink lnkExchangeHostedEditionOrganizationSummary; - /// /// lnkVpsSummaryLetter control. /// diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/UserAccountPolicySettings.ascx b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/UserAccountPolicySettings.ascx index 412ecee2..a9fc8fe1 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/UserAccountPolicySettings.ascx +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/UserAccountPolicySettings.ascx @@ -37,10 +37,6 @@
  • -
  • - -
  • diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/UserAccountPolicySettings.ascx.designer.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/UserAccountPolicySettings.ascx.designer.cs index d818355e..d47171c5 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/UserAccountPolicySettings.ascx.designer.cs +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/UserAccountPolicySettings.ascx.designer.cs @@ -93,15 +93,6 @@ namespace WebsitePanel.Portal { /// protected global::System.Web.UI.WebControls.HyperLink lnkExchangePolicy; - /// - /// lnkExchangeHostedEditionPolicy control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.HyperLink lnkExchangeHostedEditionPolicy; - /// /// lnkVpsPolicy control. /// diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/WebsitePanel.Portal.Modules.csproj b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/WebsitePanel.Portal.Modules.csproj index 969f4bfb..2bc48ea9 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/WebsitePanel.Portal.Modules.csproj +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/WebsitePanel.Portal.Modules.csproj @@ -534,13 +534,6 @@ HyperVForPrivateCloud_Settings.ascx - - SettingsExchangeHostedEditionOrganizationSummary.ascx - ASPXCodeBehind - - - SettingsExchangeHostedEditionOrganizationSummary.ascx - SetupControlPanelAccounts.ascx ASPXCodeBehind @@ -548,69 +541,6 @@ SetupControlPanelAccounts.ascx - - SpaceSettingsExchangeHostedEdition.ascx - ASPXCodeBehind - - - SpaceSettingsExchangeHostedEdition.ascx - - - SettingsExchangeHostedEditionPolicy.ascx - ASPXCodeBehind - - - SettingsExchangeHostedEditionPolicy.ascx - - - AddOrganizationDomain.ascx - ASPXCodeBehind - - - AddOrganizationDomain.ascx - - - CreateOrganization.ascx - ASPXCodeBehind - - - CreateOrganization.ascx - - - DeleteOrganization.ascx - ASPXCodeBehind - - - DeleteOrganization.ascx - - - OrganizationDetails.ascx - ASPXCodeBehind - - - OrganizationDetails.ascx - - - UpdateOrganizationCatchAll.ascx - ASPXCodeBehind - - - UpdateOrganizationCatchAll.ascx - - - UpdateOrganizationQuotas.ascx - ASPXCodeBehind - - - UpdateOrganizationQuotas.ascx - - - UpdateOrganizationServicePlan.ascx - ASPXCodeBehind - - - UpdateOrganizationServicePlan.ascx - ExchangeMailboxMobile.ascx ASPXCodeBehind @@ -3804,17 +3734,7 @@ - - - - - - - - - - @@ -4768,27 +4688,6 @@ Designer - - Designer - - - Designer - - - Designer - - - Designer - - - Designer - - - Designer - - - Designer - Designer From 50f2c43315361265545afe2175fda86cb212fd87 Mon Sep 17 00:00:00 2001 From: robvde Date: Mon, 9 Jul 2012 12:03:24 +0400 Subject: [PATCH 04/20] Significant amount of changes to hosted organizations and exchange: Exchange 2010 SP2 provisioning separated through a new provider Exchange 2010 SP2 now compliant with product group guidelines Support for Database Availability Group Fixed Distribution List view scope to only tenant Consumer support (individual mailboxes as hotmail) added Mailbox configuration moved to mailbox plans concept CN creation is now based on UPN sAMAccountName generation revised and decoupled from tenant name 2007 (ACL Based), 2010 (ACL Bases), 2010 SP2 (ABP) supported Automated Hosted Organization provisioning added to create hosting space Enterprise Server webservice extended with ImportMethod Mobile tab fixed Added more information to users listview --- WebsitePanel/Database/install_db.sql | 572 +++- WebsitePanel/Database/update_db.sql | 1286 ++++++++- .../Packages/Quotas.cs | 5 + .../ExchangeServerProxy.cs | 2333 +++++++++-------- .../OrganizationProxy.cs | 1766 ++++++++----- .../Code/Data/DataProvider.cs | 181 +- .../ExchangeServerController.cs | 1700 +++++++----- .../HostedSolution/OrganizationController.cs | 347 ++- .../esExchangeServer.asmx.cs | 656 ++--- .../esOrganizations.asmx.cs | 46 +- .../HostedSolution/ActiveDirectoryUtils.cs | 74 +- .../HostedSolution/ExchangeAccount.cs | 110 +- .../HostedSolution/ExchangeContact.cs | 350 +-- .../ExchangeDistributionList.cs | 125 +- .../HostedSolution/ExchangeMailboxPlan.cs | 160 ++ .../HostedSolution/IExchangeServer.cs | 139 +- .../HostedSolution/IOrganization.cs | 8 +- .../HostedSolution/Organization.cs | 48 +- .../HostedSolution/OrganizationUser.cs | 9 + .../HostedSolution/TransactionAction.cs | 71 + .../WebsitePanel.Providers.Base.csproj | 2 + .../Exchange2007.cs | 1327 +++++----- .../Exchange2010.cs | 2 +- .../Exchange2010SP2.cs | 753 ++++++ .../ExchangeLog.cs | 114 +- .../ExchangeTransaction.cs | 342 ++- .../OrganizationProvider.cs | 90 +- ...bsitePanel.Providers.HostedSolution.csproj | 1 + .../ExchangeServerProxy.cs | 1110 +++----- .../OrganizationProxy.cs | 207 +- .../Sources/WebsitePanel.Server.Utils/Log.cs | 226 +- .../ExchangeServer.asmx.cs | 1464 ++++++----- .../WebsitePanel.Server/Organizations.asmx.cs | 29 +- .../App_Data/SiteSettings.config | 2 +- .../App_Data/WebsitePanel_Modules.config | 5 +- .../WebsitePanel_SharedResources.ascx.resx | 17 +- .../Default/Images/Exchange/blank16.gif | Bin 0 -> 832 bytes .../Default/Images/Exchange/disabled.png | Bin 0 -> 676 bytes .../Default/Images/Exchange/enabled.png | Bin 0 -> 719 bytes .../UserCreateSpace.ascx.resx | 7 +- .../ExchangeActiveSyncSettings.ascx.resx | 6 +- .../ExchangeAddDomainName.ascx.resx | 9 +- ....resx => ExchangeAddMailboxPlan.ascx.resx} | 66 +- .../ExchangeContactGeneralSettings.ascx.resx | 4 +- .../ExchangeContactMailFlowSettings.ascx.resx | 4 +- .../ExchangeContacts.ascx.resx | 4 +- .../ExchangeCreateContact.ascx.resx | 4 +- .../ExchangeCreateDistributionList.ascx.resx | 18 +- .../ExchangeCreateMailbox.ascx.resx | 15 +- ...geDistributionListEmailAddresses.ascx.resx | 6 +- ...eDistributionListGeneralSettings.ascx.resx | 10 +- ...DistributionListMailFlowSettings.ascx.resx | 4 +- .../ExchangeDistributionLists.ascx.resx | 4 +- .../ExchangeDomainNames.ascx.resx | 10 +- .../ExchangeDomainRecords.ascx.resx | 6 +- .../ExchangeMailboxEmailAddresses.ascx.resx | 6 +- .../ExchangeMailboxGeneralSettings.ascx.resx | 85 +- .../ExchangeMailboxMailFlowSettings.ascx.resx | 4 +- .../ExchangeMailboxMobile.ascx.resx | 32 +- .../ExchangeMailboxMobileDetails.ascx.resx | 46 +- .../ExchangeMailboxPermissions.ascx.resx | 16 +- .../ExchangeMailboxPlans.ascx.resx} | 46 +- ...ExchangeMailboxSetupInstructions.ascx.resx | 4 +- .../ExchangeMailboxes.ascx.resx | 16 +- .../ExchangeStorageLimits.ascx.resx | 162 -- .../ExchangeStorageUsage.ascx.resx | 14 +- .../ExchangeStorageUsageBreakdown.ascx.resx | 4 +- .../OrganizationCreateOrganization.ascx.resx | 6 +- .../OrganizationCreateUser.ascx.resx | 15 +- .../OrganizationHome.ascx.resx | 111 +- .../OrganizationUserGeneralSettings.ascx.resx | 24 +- ...rganizationUserSetupInstructions.ascx.resx | 4 +- .../OrganizationUsers.ascx.resx | 19 +- .../Organizations.ascx.resx | 8 +- .../ExchangeActiveSyncSettings.ascx | 12 +- .../ExchangeActiveSyncSettings.ascx.cs | 6 +- ...xchangeActiveSyncSettings.ascx.designer.cs | 9 +- .../ExchangeServer/ExchangeAddDomainName.ascx | 8 +- .../ExchangeAddDomainName.ascx.cs | 48 +- .../ExchangeAddDomainName.ascx.designer.cs | 31 +- ...tings.ascx => ExchangeAddMailboxPlan.ascx} | 146 +- .../ExchangeAddMailboxPlan.ascx.cs | 192 ++ ...> ExchangeAddMailboxPlan.ascx.designer.cs} | 248 +- .../ExchangeContactGeneralSettings.ascx.cs | 27 +- ...ngeContactGeneralSettings.ascx.designer.cs | 9 +- .../ExchangeContactMailFlowSettings.ascx.cs | 17 +- ...geContactMailFlowSettings.ascx.designer.cs | 9 +- .../ExchangeServer/ExchangeContacts.ascx | 9 +- .../ExchangeServer/ExchangeContacts.ascx.cs | 93 +- .../ExchangeContacts.ascx.designer.cs | 9 - .../ExchangeCreateContact.ascx.cs | 16 +- .../ExchangeCreateContact.ascx.designer.cs | 164 +- .../ExchangeCreateDistributionList.ascx.cs | 21 +- ...ngeCreateDistributionList.ascx.designer.cs | 3 +- .../ExchangeServer/ExchangeCreateMailbox.ascx | 29 +- .../ExchangeCreateMailbox.ascx.cs | 74 +- .../ExchangeCreateMailbox.ascx.designer.cs | 44 +- ...xchangeDistributionListEmailAddresses.ascx | 11 +- ...angeDistributionListEmailAddresses.ascx.cs | 49 +- ...ibutionListEmailAddresses.ascx.designer.cs | 194 +- ...ngeDistributionListGeneralSettings.ascx.cs | 25 +- ...butionListGeneralSettings.ascx.designer.cs | 3 +- ...geDistributionListMailFlowSettings.ascx.cs | 17 +- ...utionListMailFlowSettings.ascx.designer.cs | 9 +- ...xchangeDistributionListPermissions.ascx.cs | 15 +- ...stributionListPermissions.ascx.designer.cs | 3 +- .../ExchangeDistributionLists.ascx | 9 +- .../ExchangeDistributionLists.ascx.cs | 77 +- ...ExchangeDistributionLists.ascx.designer.cs | 9 - .../ExchangeDomainNames.ascx.cs | 48 +- .../ExchangeDomainNames.ascx.designer.cs | 3 +- .../ExchangeDomainRecords.ascx.cs | 273 +- .../ExchangeDomainRecords.ascx.designer.cs | 28 - .../ExchangeMailboxAdvancedSettings.ascx.cs | 164 -- .../ExchangeMailboxEmailAddresses.ascx | 13 +- .../ExchangeMailboxEmailAddresses.ascx.cs | 59 +- ...angeMailboxEmailAddresses.ascx.designer.cs | 3 +- .../ExchangeMailboxGeneralSettings.ascx | 225 +- .../ExchangeMailboxGeneralSettings.ascx.cs | 136 +- ...ngeMailboxGeneralSettings.ascx.designer.cs | 412 +-- .../ExchangeMailboxMailFlowSettings.ascx | 27 - .../ExchangeMailboxMailFlowSettings.ascx.cs | 50 +- ...geMailboxMailFlowSettings.ascx.designer.cs | 75 +- .../ExchangeMailboxMobile.ascx.cs | 20 +- .../ExchangeMailboxMobile.ascx.designer.cs | 3 +- .../ExchangeMailboxMobileDetails.ascx.cs | 65 +- ...hangeMailboxMobileDetails.ascx.designer.cs | 3 +- .../ExchangeMailboxPermissions.ascx.cs | 20 +- ...xchangeMailboxPermissions.ascx.designer.cs | 3 +- .../ExchangeServer/ExchangeMailboxPlans.ascx | 73 + .../ExchangeMailboxPlans.ascx.cs | 126 + .../ExchangeMailboxPlans.ascx.designer.cs} | 71 +- .../ExchangeMailboxSetupInstructions.ascx.cs | 7 +- ...eMailboxSetupInstructions.ascx.designer.cs | 9 +- .../ExchangeServer/ExchangeMailboxes.ascx | 28 +- .../ExchangeServer/ExchangeMailboxes.ascx.cs | 91 +- .../ExchangeMailboxes.ascx.designer.cs | 9 - .../ExchangeServer/ExchangeStorageLimits.ascx | 91 - .../ExchangeStorageLimits.ascx.cs | 124 - .../ExchangeStorageLimits.ascx.designer.cs | 223 -- .../ExchangeServer/ExchangeStorageUsage.ascx | 2 +- .../ExchangeStorageUsage.ascx.cs | 48 +- .../ExchangeStorageUsage.ascx.designer.cs | 3 +- .../ExchangeStorageUsageBreakdown.ascx | 35 - .../ExchangeStorageUsageBreakdown.ascx.cs | 72 +- ...angeStorageUsageBreakdown.ascx.designer.cs | 141 +- .../OrganizationCreateOrganization.ascx | 5 +- .../OrganizationCreateOrganization.ascx.cs | 31 +- ...izationCreateOrganization.ascx.designer.cs | 3 +- .../OrganizationCreateUser.ascx | 17 +- .../OrganizationCreateUser.ascx.cs | 60 +- .../OrganizationCreateUser.ascx.designer.cs | 48 +- .../ExchangeServer/OrganizationHome.ascx | 81 +- .../ExchangeServer/OrganizationHome.ascx.cs | 155 +- .../OrganizationHome.ascx.designer.cs | 124 +- .../OrganizationUserGeneralSettings.ascx | 11 +- .../OrganizationUserGeneralSettings.ascx.cs | 88 +- ...zationUserGeneralSettings.ascx.designer.cs | 30 +- .../OrganizationUserSetupInstructions.ascx.cs | 3 +- ...tionUserSetupInstructions.ascx.designer.cs | 3 +- .../ExchangeServer/OrganizationUsers.ascx | 29 +- .../ExchangeServer/OrganizationUsers.ascx.cs | 98 +- .../OrganizationUsers.ascx.designer.cs | 9 - .../ExchangeServer/Organizations.ascx.cs | 87 +- .../Organizations.ascx.designer.cs | 3 +- .../App_LocalResources/MailboxTabs.ascx.resx | 12 +- .../App_LocalResources/Menu.ascx.resx | 42 +- .../UserControls/DomainSelector.ascx.cs | 82 +- .../DomainSelector.ascx.designer.cs | 9 +- .../UserControls/MailboxPlanSelector.ascx | 3 + .../UserControls/MailboxPlanSelector.ascx.cs | 105 + .../UserControls/MailboxSelector.ascx.cs | 222 +- .../MailboxSelector.ascx.designer.cs | 3 +- .../UserControls/MailboxTabs.ascx.cs | 3 +- .../ExchangeServer/UserControls/Menu.ascx.cs | 19 +- .../ExchangeServer/UserControls/SizeBox.ascx | 2 + .../UserControls/SizeBox.ascx.cs | 84 +- .../UserControls/SizeBox.ascx.designer.cs | 45 +- .../UserControls/UserSelector.ascx | 2 +- .../UserControls/UserSelector.ascx.cs | 12 +- .../UserSelector.ascx.designer.cs | 28 - .../Exchange_Settings.ascx.resx | 7 +- .../Exchange2010SP1_Settings.ascx | 63 - .../Exchange2010SP1_Settings.ascx.cs | 41 - .../ProviderControls/Exchange_Settings.ascx | 3 + .../Exchange_Settings.ascx.cs | 42 +- .../Exchange_Settings.ascx.designer.cs | 12 +- .../WebsitePanel/UserCreateSpace.ascx | 8 + .../WebsitePanel/UserCreateSpace.ascx.cs | 25 + .../UserCreateSpace.ascx.designer.cs | 12 +- .../WebsitePanel.Portal.Modules.csproj | 59 +- .../WebsitePanel.WebPortal.csproj | 3 + WebsitePanel/Sources/generate_es_proxies.bat | 6 +- .../Sources/generate_server_proxies.bat | 6 +- 194 files changed, 12994 insertions(+), 9755 deletions(-) create mode 100644 WebsitePanel/Sources/WebsitePanel.Providers.Base/HostedSolution/ExchangeMailboxPlan.cs create mode 100644 WebsitePanel/Sources/WebsitePanel.Providers.Base/HostedSolution/TransactionAction.cs create mode 100644 WebsitePanel/Sources/WebsitePanel.Providers.HostedSolution/Exchange2010SP2.cs create mode 100644 WebsitePanel/Sources/WebsitePanel.WebPortal/App_Themes/Default/Images/Exchange/blank16.gif create mode 100644 WebsitePanel/Sources/WebsitePanel.WebPortal/App_Themes/Default/Images/Exchange/disabled.png create mode 100644 WebsitePanel/Sources/WebsitePanel.WebPortal/App_Themes/Default/Images/Exchange/enabled.png rename WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/App_LocalResources/{ExchangeMailboxAdvancedSettings.ascx.resx => ExchangeAddMailboxPlan.ascx.resx} (78%) rename WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/{ProviderControls/App_LocalResources/Exchange2010SP1_Settings.ascx.resx => ExchangeServer/App_LocalResources/ExchangeMailboxPlans.ascx.resx} (74%) delete mode 100644 WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/App_LocalResources/ExchangeStorageLimits.ascx.resx rename WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/{ExchangeMailboxAdvancedSettings.ascx => ExchangeAddMailboxPlan.ascx} (54%) create mode 100644 WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeAddMailboxPlan.ascx.cs rename WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/{ExchangeMailboxAdvancedSettings.ascx.designer.cs => ExchangeAddMailboxPlan.ascx.designer.cs} (86%) delete mode 100644 WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeMailboxAdvancedSettings.ascx.cs create mode 100644 WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeMailboxPlans.ascx create mode 100644 WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeMailboxPlans.ascx.cs rename WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/{ProviderControls/Exchange2010SP1_Settings.ascx.designer.cs => ExchangeServer/ExchangeMailboxPlans.ascx.designer.cs} (53%) delete mode 100644 WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeStorageLimits.ascx delete mode 100644 WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeStorageLimits.ascx.cs delete mode 100644 WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeStorageLimits.ascx.designer.cs create mode 100644 WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/UserControls/MailboxPlanSelector.ascx create mode 100644 WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/UserControls/MailboxPlanSelector.ascx.cs delete mode 100644 WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ProviderControls/Exchange2010SP1_Settings.ascx delete mode 100644 WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ProviderControls/Exchange2010SP1_Settings.ascx.cs diff --git a/WebsitePanel/Database/install_db.sql b/WebsitePanel/Database/install_db.sql index cebc7caf..be7e742f 100644 --- a/WebsitePanel/Database/install_db.sql +++ b/WebsitePanel/Database/install_db.sql @@ -29,7 +29,7 @@ CREATE TABLE [dbo].[ExchangeAccounts]( [AccountID] [int] IDENTITY(1,1) NOT NULL, [ItemID] [int] NOT NULL, [AccountType] [int] NOT NULL, - [AccountName] [nvarchar](20) COLLATE Latin1_General_CI_AS NOT NULL, + [AccountName] [nvarchar](300) COLLATE Latin1_General_CI_AS NOT NULL, [DisplayName] [nvarchar](300) COLLATE Latin1_General_CI_AS NOT NULL, [PrimaryEmailAddress] [nvarchar](300) COLLATE Latin1_General_CI_AS NULL, [MailEnabledPublicFolder] [bit] NULL, @@ -37,6 +37,8 @@ CREATE TABLE [dbo].[ExchangeAccounts]( [SamAccountName] [nvarchar](100) COLLATE Latin1_General_CI_AS NULL, [AccountPassword] [nvarchar](200) COLLATE Latin1_General_CI_AS NULL, [CreatedDate] [datetime] NOT NULL, + [MailboxPlanId] [int] NULL, + [SubscriberNumber] [nvarchar] (32) COLLATE Latin1_General_CI_AS NULL, CONSTRAINT [PK_ExchangeAccounts] PRIMARY KEY CLUSTERED ( [AccountID] ASC @@ -54,6 +56,32 @@ SET QUOTED_IDENTIFIER ON GO +CREATE TABLE [dbo].[ExchangeMailboxPlans]( + [MailboxPlanId] [int] IDENTITY(1,1) NOT NULL, + [ItemID] [int] NOT NULL, + [MailboxPlan] [nvarchar](300) COLLATE Latin1_General_CI_AS NOT NULL, + [EnableActiveSync] [bit] NOT NULL, + [EnableIMAP] [bit] NOT NULL, + [EnableMAPI] [bit] NOT NULL, + [EnableOWA] [bit] NOT NULL, + [EnablePOP] [bit] NOT NULL, + [IsDefault] [bit] NOT NULL, + [IssueWarningPct] [int] NOT NULL, + [KeepDeletedItemsDays] [int] NOT NULL, + [MailboxSizeMB] [int] NOT NULL, + [MaxReceiveMessageSizeKB] [int] NOT NULL, + [MaxRecipients] [int] NOT NULL, + [MaxSendMessageSizeKB] [int] NOT NULL, + [ProhibitSendPct] [int] NOT NULL, + [ProhibitSendReceivePct] [int] NOT NULL, + [HideFromAddressBook] [bit] NOT NULL, + CONSTRAINT [PK_ExchangeMailboxPlans] PRIMARY KEY CLUSTERED +( + [MailboxPlanId] ASC +)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] +) ON [PRIMARY] + +GO @@ -80,7 +108,8 @@ SELECT AccountName, DisplayName, PrimaryEmailAddress, - MailEnabledPublicFolder + MailEnabledPublicFolder, + SubscriberNumber FROM ExchangeAccounts WHERE @@ -109,6 +138,7 @@ END + GO @@ -150,21 +180,71 @@ CREATE PROCEDURE [dbo].[GetExchangeAccounts] ) AS SELECT - AccountID, - ItemID, - AccountType, - AccountName, - DisplayName, - PrimaryEmailAddress, - MailEnabledPublicFolder + E.AccountID, + E.ItemID, + E.AccountType, + E.AccountName, + E.DisplayName, + E.PrimaryEmailAddress, + E.MailEnabledPublicFolder, + E.MailboxPlanId, + P.MailboxPlan, + E.SubscriberNumber FROM - ExchangeAccounts + ExchangeAccounts AS E +INNER JOIN ExchangeMailboxPlans AS P ON E.MailboxPlanId = P.MailboxPlanId WHERE - ItemID = @ItemID AND - (AccountType = @AccountType OR @AccountType IS NULL) + E.ItemID = @ItemID AND + (E.AccountType = @AccountType OR @AccountType IS NULL) ORDER BY DisplayName RETURN +GO + + + + + + + + + + + + + + + + + + +CREATE PROCEDURE [dbo].[GetExchangeAccountByAccountName] +( + @ItemID int, + @AccountName nvarchar(300) +) +AS +SELECT + E.AccountID, + E.ItemID, + E.AccountType, + E.AccountName, + E.DisplayName, + E.PrimaryEmailAddress, + E.MailEnabledPublicFolder, + E.MailboxManagerActions, + E.SamAccountName, + E.AccountPassword, + E.MailboxPlanId, + P.MailboxPlan, + E.SubscriberNumber +FROM + ExchangeAccounts AS E +LEFT OUTER JOIN ExchangeMailboxPlans AS P ON E.MailboxPlanId = P.MailboxPlanId +WHERE + E.ItemID = @ItemID AND + E.AccountName = @AccountName +RETURN @@ -231,21 +311,25 @@ CREATE PROCEDURE [dbo].[GetExchangeAccount] ) AS SELECT - AccountID, - ItemID, - AccountType, - AccountName, - DisplayName, - PrimaryEmailAddress, - MailEnabledPublicFolder, - MailboxManagerActions, - SamAccountName, - AccountPassword + E.AccountID, + E.ItemID, + E.AccountType, + E.AccountName, + E.DisplayName, + E.PrimaryEmailAddress, + E.MailEnabledPublicFolder, + E.MailboxManagerActions, + E.SamAccountName, + E.AccountPassword, + E.MailboxPlanId, + P.MailboxPlan, + E.SubscriberNumber FROM - ExchangeAccounts + ExchangeAccounts AS E +LEFT OUTER JOIN ExchangeMailboxPlans AS P ON E.MailboxPlanId = P.MailboxPlanId WHERE - ItemID = @ItemID AND - AccountID = @AccountID + E.ItemID = @ItemID AND + E.AccountID = @AccountID RETURN @@ -311,14 +395,14 @@ GO -CREATE PROCEDURE ExchangeAccountExists +CREATE PROCEDURE [dbo].[ExchangeAccountExists] ( @AccountName nvarchar(20), @Exists bit OUTPUT ) AS SET @Exists = 0 -IF EXISTS(SELECT * FROM ExchangeAccounts WHERE AccountName = @AccountName) +IF EXISTS(SELECT * FROM ExchangeAccounts WHERE sAMAccountName LIKE '%\'+@AccountName) BEGIN SET @Exists = 1 END @@ -352,6 +436,10 @@ RETURN + + + + @@ -936,7 +1024,7 @@ GO -CREATE PROCEDURE SearchExchangeAccounts +CREATE PROCEDURE [dbo].[SearchExchangeAccounts] ( @ActorID int, @ItemID int, @@ -986,7 +1074,8 @@ SELECT EA.AccountName, EA.DisplayName, EA.PrimaryEmailAddress, - EA.MailEnabledPublicFolder + EA.MailEnabledPublicFolder, + EA.SubscriberNumber FROM ExchangeAccounts AS EA WHERE ' + @condition @@ -1026,6 +1115,7 @@ RETURN + GO @@ -1080,6 +1170,10 @@ END IF @SortColumn IS NULL OR @SortColumn = '' SET @SortColumn = 'EA.DisplayName ASC' +DECLARE @joincondition nvarchar(700) + SET @joincondition = ',P.MailboxPlan FROM ExchangeAccounts AS EA + LEFT OUTER JOIN ExchangeMailboxPlans AS P ON EA.MailboxPlanId = P.MailboxPlanId' + DECLARE @sql nvarchar(3500) set @sql = ' @@ -1094,9 +1188,10 @@ WITH Accounts AS ( EA.AccountName, EA.DisplayName, EA.PrimaryEmailAddress, - EA.MailEnabledPublicFolder - FROM ExchangeAccounts AS EA - WHERE ' + @condition + ' + EA.MailEnabledPublicFolder, + EA.MailboxPlanId, + EA.SubscriberNumber ' + @joincondition + + ' WHERE ' + @condition + ' ) SELECT * FROM Accounts @@ -1118,6 +1213,7 @@ RETURN + GO SET ANSI_NULLS ON GO @@ -1407,13 +1503,15 @@ CREATE PROCEDURE [dbo].[AddExchangeAccount] @AccountID int OUTPUT, @ItemID int, @AccountType int, - @AccountName nvarchar(20), + @AccountName nvarchar(300), @DisplayName nvarchar(300), @PrimaryEmailAddress nvarchar(300), @MailEnabledPublicFolder bit, @MailboxManagerActions varchar(200), @SamAccountName nvarchar(100), - @AccountPassword nvarchar(200) + @AccountPassword nvarchar(200), + @MailboxPlanId int, + @SubscriberNumber nvarchar(32) ) AS @@ -1427,7 +1525,9 @@ INSERT INTO ExchangeAccounts MailEnabledPublicFolder, MailboxManagerActions, SamAccountName, - AccountPassword + AccountPassword, + MailboxPlanId, + SubscriberNumber ) VALUES ( @@ -1439,7 +1539,9 @@ VALUES @MailEnabledPublicFolder, @MailboxManagerActions, @SamAccountName, - @AccountPassword + @AccountPassword, + @MailboxPlanId, + @SubscriberNumber ) SET @AccountID = SCOPE_IDENTITY() @@ -1475,6 +1577,7 @@ RETURN + GO @@ -3538,9 +3641,9 @@ INSERT [dbo].[Quotas] ([QuotaID], [GroupID], [QuotaOrder], [QuotaName], [QuotaDe GO INSERT [dbo].[Quotas] ([QuotaID], [GroupID], [QuotaOrder], [QuotaName], [QuotaDescription], [QuotaTypeID], [ServiceQuota], [ItemTypeID]) VALUES (75, 1, 8, N'OS.ExtraApplications', N'Extra Application Packs', 1, 0, NULL) GO -INSERT [dbo].[Quotas] ([QuotaID], [GroupID], [QuotaOrder], [QuotaName], [QuotaDescription], [QuotaTypeID], [ServiceQuota], [ItemTypeID]) VALUES (77, 12, 2, N'Exchange2007.DiskSpace', N'Organization Disk Space, MB', 3, 0, NULL) +INSERT [dbo].[Quotas] ([QuotaID], [GroupID], [QuotaOrder], [QuotaName], [QuotaDescription], [QuotaTypeID], [ServiceQuota], [ItemTypeID]) VALUES (77, 12, 2, N'Exchange2007.DiskSpace', N'Organization Disk Space, MB', 21, 0, NULL) GO -INSERT [dbo].[Quotas] ([QuotaID], [GroupID], [QuotaOrder], [QuotaName], [QuotaDescription], [QuotaTypeID], [ServiceQuota], [ItemTypeID]) VALUES (78, 12, 3, N'Exchange2007.Mailboxes', N'Mailboxes per Organization', 3, 0, NULL) +INSERT [dbo].[Quotas] ([QuotaID], [GroupID], [QuotaOrder], [QuotaName], [QuotaDescription], [QuotaTypeID], [ServiceQuota], [ItemTypeID]) VALUES (78, 12, 3, N'Exchange2007.Mailboxes', N'Mailboxes per Organization', 2, 0, NULL) GO INSERT [dbo].[Quotas] ([QuotaID], [GroupID], [QuotaOrder], [QuotaName], [QuotaDescription], [QuotaTypeID], [ServiceQuota], [ItemTypeID]) VALUES (79, 12, 4, N'Exchange2007.Contacts', N'Contacts per Organization', 3, 0, NULL) GO @@ -3560,16 +3663,6 @@ INSERT [dbo].[Quotas] ([QuotaID], [GroupID], [QuotaOrder], [QuotaName], [QuotaDe GO INSERT [dbo].[Quotas] ([QuotaID], [GroupID], [QuotaOrder], [QuotaName], [QuotaDescription], [QuotaTypeID], [ServiceQuota], [ItemTypeID]) VALUES (88, 12, 8, N'Exchange2007.MailEnabledPublicFolders', N'Mail Enabled Public Folders Allowed', 1, 0, NULL) GO -INSERT [dbo].[Quotas] ([QuotaID], [GroupID], [QuotaOrder], [QuotaName], [QuotaDescription], [QuotaTypeID], [ServiceQuota], [ItemTypeID]) VALUES (89, 12, 10, N'Exchange2007.POP3Enabled', N'POP3 Enabled by default', 1, 0, NULL) -GO -INSERT [dbo].[Quotas] ([QuotaID], [GroupID], [QuotaOrder], [QuotaName], [QuotaDescription], [QuotaTypeID], [ServiceQuota], [ItemTypeID]) VALUES (90, 12, 12, N'Exchange2007.IMAPEnabled', N'IMAP Enabled by default', 1, 0, NULL) -GO -INSERT [dbo].[Quotas] ([QuotaID], [GroupID], [QuotaOrder], [QuotaName], [QuotaDescription], [QuotaTypeID], [ServiceQuota], [ItemTypeID]) VALUES (91, 12, 14, N'Exchange2007.OWAEnabled', N'OWA Enabled by default', 1, 0, NULL) -GO -INSERT [dbo].[Quotas] ([QuotaID], [GroupID], [QuotaOrder], [QuotaName], [QuotaDescription], [QuotaTypeID], [ServiceQuota], [ItemTypeID]) VALUES (92, 12, 16, N'Exchange2007.MAPIEnabled', N'MAPI Enabled by default', 1, 0, NULL) -GO -INSERT [dbo].[Quotas] ([QuotaID], [GroupID], [QuotaOrder], [QuotaName], [QuotaDescription], [QuotaTypeID], [ServiceQuota], [ItemTypeID]) VALUES (93, 12, 18, N'Exchange2007.ActiveSyncEnabled', N'ActiveSync Enabled by default', 1, 0, NULL) -GO INSERT [dbo].[Quotas] ([QuotaID], [GroupID], [QuotaOrder], [QuotaName], [QuotaDescription], [QuotaTypeID], [ServiceQuota], [ItemTypeID]) VALUES (94, 2, 17, N'Web.ColdFusion', N'ColdFusion', 1, 0, NULL) GO INSERT [dbo].[Quotas] ([QuotaID], [GroupID], [QuotaOrder], [QuotaName], [QuotaDescription], [QuotaTypeID], [ServiceQuota], [ItemTypeID]) VALUES (95, 2, 1, N'Web.WebAppGallery', N'Web Application Gallery', 1, 0, NULL) @@ -3602,7 +3695,7 @@ INSERT [dbo].[Quotas] ([QuotaID], [GroupID], [QuotaOrder], [QuotaName], [QuotaDe GO INSERT [dbo].[Quotas] ([QuotaID], [GroupID], [QuotaOrder], [QuotaName], [QuotaDescription], [QuotaTypeID], [ServiceQuota], [ItemTypeID]) VALUES (205, 13, 1, N'HostedSolution.Organizations', N'Organizations', 2, 0, 29) GO -INSERT [dbo].[Quotas] ([QuotaID], [GroupID], [QuotaOrder], [QuotaName], [QuotaDescription], [QuotaTypeID], [ServiceQuota], [ItemTypeID]) VALUES (206, 13, 2, N'HostedSolution.Users', N'Users', 3, 0, 30) +INSERT [dbo].[Quotas] ([QuotaID], [GroupID], [QuotaOrder], [QuotaName], [QuotaDescription], [QuotaTypeID], [ServiceQuota], [ItemTypeID]) VALUES (206, 13, 2, N'HostedSolution.Users', N'Users', 2, 0, 30) GO INSERT [dbo].[Quotas] ([QuotaID], [GroupID], [QuotaOrder], [QuotaName], [QuotaDescription], [QuotaTypeID], [ServiceQuota], [ItemTypeID]) VALUES (207, 13, 3, N'HostedSolution.Domains', N'Domains per Organizations', 3, 0, NULL) GO @@ -3748,6 +3841,16 @@ INSERT [dbo].[Quotas] ([QuotaID], [GroupID], [QuotaOrder], [QuotaName], [QuotaDe GO INSERT [dbo].[Quotas] ([QuotaID], [GroupID], [QuotaOrder], [QuotaName], [QuotaDescription], [QuotaTypeID], [ServiceQuota], [ItemTypeID]) VALUES (363, 40, 12, N'VPSForPC.Bandwidth', N'Monthly bandwidth, GB', 2, 0, NULL) GO +INSERT [dbo].[Quotas] ([QuotaID], [GroupID], [QuotaOrder], [QuotaName], [QuotaDescription], [QuotaTypeID], [ServiceQuota], [ItemTypeID]) VALUES (364, 12, 19, N'Exchange2007.KeepDeletedItemsDays', N'Keep Deleted Items (days)', 3, 0, NULL) +GO +INSERT [dbo].[Quotas] ([QuotaID], [GroupID], [QuotaOrder], [QuotaName], [QuotaDescription], [QuotaTypeID], [ServiceQuota], [ItemTypeID]) VALUES (365, 12, 20, N'Exchange2007.MaxRecipients', N'Maximum Recipients', 3, 0, NULL) +GO +INSERT [dbo].[Quotas] ([QuotaID], [GroupID], [QuotaOrder], [QuotaName], [QuotaDescription], [QuotaTypeID], [ServiceQuota], [ItemTypeID]) VALUES (366, 12, 21, N'Exchange2007.MaxSendMessageSizeKB', N'Maximum Send Message Size (Kb)', 3, 0, NULL) +GO +INSERT [dbo].[Quotas] ([QuotaID], [GroupID], [QuotaOrder], [QuotaName], [QuotaDescription], [QuotaTypeID], [ServiceQuota], [ItemTypeID]) VALUES (367, 12, 22, N'Exchange2007.MaxReceiveMessageSizeKB', N'Maximum Receive Message Size (Kb)', 3, 0, NULL) +GO +INSERT [dbo].[Quotas] ([QuotaID], [GroupID], [QuotaOrder], [QuotaName], [QuotaDescription], [QuotaTypeID], [ServiceQuota], [ItemTypeID]) VALUES (368, 12, 1, N'Exchange2007.IsConsumer',N'Is Consumer Organization',1, 0 , NULL) +GO INSERT [dbo].[Quotas] ([QuotaID], [GroupID], [QuotaOrder], [QuotaName], [QuotaDescription], [QuotaTypeID], [ServiceQuota], [ItemTypeID]) VALUES (400, 20, 3, N'HostedSharePoint.UseSharedSSL', N'Use shared SSL Root', 1, 0, NULL) GO @@ -5866,7 +5969,7 @@ SET QUOTED_IDENTIFIER ON GO CREATE TABLE [dbo].[ExchangeOrganizations]( [ItemID] [int] NOT NULL, - [OrganizationID] [nvarchar](10) COLLATE Latin1_General_CI_AS NOT NULL, + [OrganizationID] [nvarchar](128) COLLATE Latin1_General_CI_AS NOT NULL, CONSTRAINT [PK_ExchangeOrganizations] PRIMARY KEY CLUSTERED ( [ItemID] ASC @@ -5980,8 +6083,10 @@ CREATE PROCEDURE DeleteExchangeOrganization @ItemID int ) AS -DELETE FROM ExchangeOrganizations -WHERE ItemID = @ItemID +BEGIN TRAN + DELETE FROM ExchangeMailboxPlans WHERE ItemID = @ItemID + DELETE FROM ExchangeOrganizations WHERE ItemID = @ItemID +COMMIT TRAN RETURN @@ -6053,7 +6158,7 @@ GO CREATE PROCEDURE AddExchangeOrganization ( @ItemID int, - @OrganizationID nvarchar(10) + @OrganizationID nvarchar(128) ) AS @@ -6241,7 +6346,8 @@ SELECT (SELECT COUNT(*) FROM ExchangeAccounts WHERE AccountType = 2 AND ItemID = @ItemID) AS CreatedContacts, (SELECT COUNT(*) FROM ExchangeAccounts WHERE AccountType = 3 AND ItemID = @ItemID) AS CreatedDistributionLists, (SELECT COUNT(*) FROM ExchangeAccounts WHERE AccountType = 4 AND ItemID = @ItemID) AS CreatedPublicFolders, - (SELECT COUNT(*) FROM ExchangeOrganizationDomains WHERE ItemID = @ItemID) AS CreatedDomains + (SELECT COUNT(*) FROM ExchangeOrganizationDomains WHERE ItemID = @ItemID) AS CreatedDomains, + (SELECT SUM(B.MailboxSizeMB) FROM ExchangeAccounts AS A INNER JOIN ExchangeMailboxPlans AS B ON A.MailboxPlanId = B.MailboxPlanId WHERE A.ItemID=@ItemID) AS UsedDiskSpace RETURN @@ -6272,7 +6378,6 @@ RETURN - GO @@ -6611,18 +6716,26 @@ GO CREATE PROCEDURE [dbo].[UpdateExchangeAccount] ( @AccountID int, - @AccountName nvarchar(20), + @AccountName nvarchar(300), @DisplayName nvarchar(300), @PrimaryEmailAddress nvarchar(300), @AccountType int, @SamAccountName nvarchar(100), @MailEnabledPublicFolder bit, @MailboxManagerActions varchar(200), - @Password varchar(200) + @Password varchar(200), + @MailboxPlanId int, + @SubscriberNumber varchar(32) ) AS BEGIN TRAN + +IF (@MailboxPlanId = -1) +BEGIN + SET @MailboxPlanId = NULL +END + UPDATE ExchangeAccounts SET AccountName = @AccountName, DisplayName = @DisplayName, @@ -6630,7 +6743,9 @@ UPDATE ExchangeAccounts SET MailEnabledPublicFolder = @MailEnabledPublicFolder, MailboxManagerActions = @MailboxManagerActions, AccountType =@AccountType, - SamAccountName = @SamAccountName + SamAccountName = @SamAccountName, + MailboxPlanId = @MailboxPlanId, + SubscriberNumber = @SubscriberNumber WHERE AccountID = @AccountID @@ -6667,6 +6782,10 @@ RETURN + + + + GO @@ -8899,7 +9018,8 @@ SELECT EA.AccountType, EA.AccountName, EA.DisplayName, - EA.PrimaryEmailAddress + EA.PrimaryEmailAddress, + EA.SubscriberNumber FROM ExchangeAccounts AS EA WHERE ' + @condition @@ -8936,6 +9056,8 @@ RETURN + + @@ -20551,7 +20673,7 @@ GO -CREATE PROCEDURE GetPackages +CREATE PROCEDURE [dbo].[GetPackages] ( @ActorID int, @UserID int @@ -20590,8 +20712,7 @@ INNER JOIN Users AS U ON P.UserID = U.UserID INNER JOIN Servers AS S ON P.ServerID = S.ServerID INNER JOIN HostingPlans AS HP ON P.PlanID = HP.PlanID WHERE - P.UserID <> @UserID - AND dbo.CheckUserParent(@UserID, P.UserID) = 1 + P.UserID = @UserID RETURN @@ -23257,6 +23378,8 @@ INSERT [dbo].[Providers] ([ProviderID], [GroupID], [ProviderName], [DisplayName] GO INSERT [dbo].[Providers] ([ProviderID], [GroupID], [ProviderName], [DisplayName], [ProviderType], [EditorControl], [DisableAutoDiscovery]) VALUES (400, 40, N'HyperVForPC', N'Microsoft Hyper-V For Private Cloud', N'WebsitePanel.Providers.VirtualizationForPC.HyperVForPC, WebsitePanel.Providers.VirtualizationForPC.HyperVForPC', N'HyperVForPrivateCloud', 1) GO +INSERT [dbo].[Providers] ([ProviderId], [GroupId], [ProviderName], [DisplayName], [ProviderType], [EditorControl], [DisableAutoDiscovery]) VALUES(90, 12, N'Exchange2010SP2', N'Hosted Microsoft Exchange Server 2010 SP2', N'WebsitePanel.Providers.HostedSolution.Exchange2010SP2, WebsitePanel.Providers.HostedSolution', N'Exchange', 1) +GO SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON @@ -25738,21 +25861,27 @@ AS INNER JOIN PackagesTreeCache AS PT ON PIP.PackageID = PT.PackageID WHERE PT.ParentPackageID = @PackageID AND IP.PoolID = 3) ELSE IF @QuotaID = 319 -- BB Users - SET @Result = (SELECT COUNT(ea.AccountID) - FROM - ExchangeAccounts ea - INNER JOIN - BlackBerryUsers bu - ON - ea.AccountID = bu.AccountID - INNER JOIN - ServiceItems si - ON - ea.ItemID = si.ItemID - INNER JOIN - PackagesTreeCache pt ON si.PackageID = pt.PackageID - WHERE - pt.ParentPackageID = @PackageID) + SET @Result = (SELECT COUNT(ea.AccountID) FROM ExchangeAccounts ea + INNER JOIN BlackBerryUsers bu ON ea.AccountID = bu.AccountID + INNER JOIN ServiceItems si ON ea.ItemID = si.ItemID + INNER JOIN PackagesTreeCache pt ON si.PackageID = pt.PackageID + WHERE pt.ParentPackageID = @PackageID) + ELSE IF @QuotaID = 206 -- HostedSolution.Users + SET @Result = (SELECT COUNT(ea.AccountID) FROM ExchangeAccounts AS ea + INNER JOIN ServiceItems si ON ea.ItemID = si.ItemID + INNER JOIN PackagesTreeCache pt ON si.PackageID = pt.PackageID + WHERE pt.ParentPackageID = @PackageID AND ea.AccountType IN (1,5,6,7)) + ELSE IF @QuotaID = 78 -- Exchange2007.Mailboxes + SET @Result = (SELECT COUNT(ea.AccountID) FROM ExchangeAccounts AS ea + INNER JOIN ServiceItems si ON ea.ItemID = si.ItemID + INNER JOIN PackagesTreeCache pt ON si.PackageID = pt.PackageID + WHERE pt.ParentPackageID = @PackageID AND ea.MailboxPlanId IS NOT NULL) + ELSE IF @QuotaID = 77 -- Exchange2007.DiskSpace + SET @Result = (SELECT SUM(B.MailboxSizeMB) FROM ExchangeAccounts AS ea + INNER JOIN ExchangeMailboxPlans AS B ON ea.MailboxPlanId = B.MailboxPlanId + INNER JOIN ServiceItems si ON ea.ItemID = si.ItemID + INNER JOIN PackagesTreeCache pt ON si.PackageID = pt.PackageID + WHERE pt.ParentPackageID = @PackageID) ELSE SET @Result = (SELECT COUNT(SI.ItemID) FROM Quotas AS Q INNER JOIN ServiceItems AS SI ON SI.ItemTypeID = Q.ItemTypeID @@ -25761,14 +25890,10 @@ AS RETURN @Result END +GO -GO -SET ANSI_NULLS ON -GO -SET QUOTED_IDENTIFIER ON -GO @@ -44451,6 +44576,7 @@ EXEC sp_xml_removedocument @idoc COMMIT TRAN RETURN +GO @@ -44473,27 +44599,280 @@ RETURN +CREATE PROCEDURE [dbo].[AddExchangeMailboxPlan] +( + @MailboxPlanId int OUTPUT, + @ItemID int, + @MailboxPlan nvarchar(300), + @EnableActiveSync bit, + @EnableIMAP bit, + @EnableMAPI bit, + @EnableOWA bit, + @EnablePOP bit, + @IsDefault bit, + @IssueWarningPct int, + @KeepDeletedItemsDays int, + @MailboxSizeMB int, + @MaxReceiveMessageSizeKB int, + @MaxRecipients int, + @MaxSendMessageSizeKB int, + @ProhibitSendPct int, + @ProhibitSendReceivePct int , + @HideFromAddressBook bit +) +AS +INSERT INTO ExchangeMailboxPlans +( + ItemID, + MailboxPlan, + EnableActiveSync, + EnableIMAP, + EnableMAPI, + EnableOWA, + EnablePOP, + IsDefault, + IssueWarningPct, + KeepDeletedItemsDays, + MailboxSizeMB, + MaxReceiveMessageSizeKB, + MaxRecipients, + MaxSendMessageSizeKB, + ProhibitSendPct, + ProhibitSendReceivePct, + HideFromAddressBook +) +VALUES +( + @ItemID, + @MailboxPlan, + @EnableActiveSync, + @EnableIMAP, + @EnableMAPI, + @EnableOWA, + @EnablePOP, + @IsDefault, + @IssueWarningPct, + @KeepDeletedItemsDays, + @MailboxSizeMB, + @MaxReceiveMessageSizeKB, + @MaxRecipients, + @MaxSendMessageSizeKB, + @ProhibitSendPct, + @ProhibitSendReceivePct, + @HideFromAddressBook +) +SET @MailboxPlanId = SCOPE_IDENTITY() - - - - - - - - - - +RETURN GO + + + + + + + + + + + + + + +CREATE PROCEDURE [dbo].[SetExchangeAccountMailboxplan] +( + @AccountID int, + @MailboxPlanId int +) +AS + +UPDATE ExchangeAccounts SET + MailboxPlanId = @MailboxPlanId +WHERE + AccountID = @AccountID + +RETURN +GO + + + + + + + + + + + +CREATE PROCEDURE [dbo].[SetOrganizationDefaultExchangeMailboxPlan] +( + @ItemId int, + @MailboxPlanId int +) +AS + +UPDATE ExchangeMailboxPlans SET IsDefault=0 WHERE ItemId=@ItemId +UPDATE ExchangeMailboxPlans SET IsDefault=1 WHERE MailboxPlanId=@MailboxPlanId + +RETURN +GO + + + + + + + + + + + + + + + +CREATE PROCEDURE [dbo].[GetExchangeMailboxPlan] +( + @MailboxPlanId int +) +AS +SELECT + MailboxPlanId, + ItemID, + MailboxPlan, + EnableActiveSync, + EnableIMAP, + EnableMAPI, + EnableOWA, + EnablePOP, + IsDefault, + IssueWarningPct, + KeepDeletedItemsDays, + MailboxSizeMB, + MaxReceiveMessageSizeKB, + MaxRecipients, + MaxSendMessageSizeKB, + ProhibitSendPct, + ProhibitSendReceivePct, + HideFromAddressBook +FROM + ExchangeMailboxPlans +WHERE + MailboxPlanId = @MailboxPlanId +RETURN +GO + + + + + + + + + + + +CREATE PROCEDURE [dbo].[GetExchangeMailboxPlans] +( + @ItemID int +) +AS +SELECT + MailboxPlanId, + ItemID, + MailboxPlan, + EnableActiveSync, + EnableIMAP, + EnableMAPI, + EnableOWA, + EnablePOP, + IsDefault, + IssueWarningPct, + KeepDeletedItemsDays, + MailboxSizeMB, + MaxReceiveMessageSizeKB, + MaxRecipients, + MaxSendMessageSizeKB, + ProhibitSendPct, + ProhibitSendReceivePct, + HideFromAddressBook +FROM + ExchangeMailboxPlans +WHERE + ItemID = @ItemID +ORDER BY MailboxPlan +RETURN +GO + + + + + + + + + + + + + +CREATE PROCEDURE [dbo].[DeleteExchangeMailboxPlan] +( + @MailboxPlanId int +) +AS + +-- delete mailboxplan +DELETE FROM ExchangeMailboxPlans +WHERE MailboxPlanId = @MailboxPlanId + +RETURN +GO + + + + + + + + + + + + + ALTER TABLE [dbo].[ScheduleParameters] WITH CHECK ADD CONSTRAINT [FK_ScheduleParameters_Schedule] FOREIGN KEY([ScheduleID]) REFERENCES [dbo].[Schedule] ([ScheduleID]) ON DELETE CASCADE GO ALTER TABLE [dbo].[ScheduleParameters] CHECK CONSTRAINT [FK_ScheduleParameters_Schedule] GO +ALTER TABLE dbo.ExchangeMailboxPlans ADD CONSTRAINT + IX_ExchangeMailboxPlans UNIQUE NONCLUSTERED + ( + MailboxPlanId + ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] + +GO +ALTER TABLE dbo.ExchangeMailboxPlans ADD CONSTRAINT + FK_ExchangeMailboxPlans_ExchangeOrganizations FOREIGN KEY + ( + ItemID + ) REFERENCES dbo.ExchangeOrganizations + ( + ItemID + ) ON UPDATE NO ACTION + ON DELETE CASCADE +GO + +ALTER TABLE [dbo].[ExchangeAccounts] WITH CHECK ADD CONSTRAINT [FK_ExchangeAccounts_ExchangeMailboxPlans] FOREIGN KEY([MailboxPlanId]) +REFERENCES [dbo].[ExchangeMailboxPlans] ([MailboxPlanId]) +GO +ALTER TABLE [dbo].[ExchangeAccounts] CHECK CONSTRAINT [FK_ExchangeAccounts_ExchangeMailboxPlans] +GO ALTER TABLE [dbo].[ExchangeAccounts] WITH CHECK ADD CONSTRAINT [FK_ExchangeAccounts_ServiceItems] FOREIGN KEY([ItemID]) REFERENCES [dbo].[ServiceItems] ([ItemID]) ON DELETE CASCADE @@ -44713,6 +45092,12 @@ ON DELETE CASCADE GO ALTER TABLE [dbo].[ExchangeOrganizations] CHECK CONSTRAINT [FK_ExchangeOrganizations_ServiceItems] GO +ALTER TABLE [dbo].[ExchangeOrganizations] WITH CHECK ADD CONSTRAINT [FK_ExchangeOrganizations_ExchangeMailboxPlans] FOREIGN KEY([ItemID]) +REFERENCES [dbo].[ExchangeMailboxPlans] ([ItemID]) +ON DELETE CASCADE +GO +ALTER TABLE [dbo].[ExchangeOrganizations] CHECK CONSTRAINT [FK_ExchangeOrganizations_ExchangeMailboxPlans] +GO ALTER TABLE [dbo].[ExchangeOrganizationDomains] WITH CHECK ADD CONSTRAINT [FK_ExchangeOrganizationDomains_ServiceItems] FOREIGN KEY([ItemID]) REFERENCES [dbo].[ServiceItems] ([ItemID]) ON DELETE CASCADE @@ -45117,4 +45502,5 @@ ON DELETE CASCADE GO ALTER TABLE [dbo].[ServiceProperties] CHECK CONSTRAINT [FK_ServiceProperties_Services] GO - \ No newline at end of file + + diff --git a/WebsitePanel/Database/update_db.sql b/WebsitePanel/Database/update_db.sql index cb5595fa..eb5435ba 100644 --- a/WebsitePanel/Database/update_db.sql +++ b/WebsitePanel/Database/update_db.sql @@ -12,8 +12,7 @@ BEGIN END GO - -IF NOT EXISTS (SELECT * FROM [dbo].[UserSetting] WHERE ([GroupName] = 1) AND ([SettingsName] = 'WebPolicy') AND ([PropertyName] = 'EnableParkingPageTokens')) +IF NOT EXISTS (SELECT * FROM [dbo].[UserSettings] WHERE ([UserID] = 1) AND ([SettingsName] = 'WebPolicy') AND ([PropertyName] = 'EnableParkingPageTokens')) BEGIN INSERT [dbo].[UserSettings] ([UserID], [SettingsName], [PropertyName], [PropertyValue]) VALUES (1, N'WebPolicy', N'EnableParkingPageTokens', N'False') END @@ -135,6 +134,56 @@ END GO +IF NOT EXISTS (SELECT * FROM [dbo].[Quotas] WHERE [QuotaName] = 'Exchange2007.KeepDeletedItemsDays') +BEGIN +INSERT [dbo].[Quotas] ([QuotaID], [GroupID], [QuotaOrder], [QuotaName], [QuotaDescription], [QuotaTypeID], [ServiceQuota], [ItemTypeID]) VALUES (364, 12, 19, N'Exchange2007.KeepDeletedItemsDays', N'Keep Deleted Items (days)', 3, 0, NULL) +END +GO + +IF NOT EXISTS (SELECT * FROM [dbo].[Quotas] WHERE [QuotaName] = 'Exchange2007.MaxRecipients') +BEGIN +INSERT [dbo].[Quotas] ([QuotaID], [GroupID], [QuotaOrder], [QuotaName], [QuotaDescription], [QuotaTypeID], [ServiceQuota], [ItemTypeID]) VALUES (365, 12, 20, N'Exchange2007.MaxRecipients', N'Maximum Recipients', 3, 0, NULL) +END +GO + +IF NOT EXISTS (SELECT * FROM [dbo].[Quotas] WHERE [QuotaName] = 'Exchange2007.MaxSendMessageSizeKB') +BEGIN +INSERT [dbo].[Quotas] ([QuotaID], [GroupID], [QuotaOrder], [QuotaName], [QuotaDescription], [QuotaTypeID], [ServiceQuota], [ItemTypeID]) VALUES (366, 12, 21, N'Exchange2007.MaxSendMessageSizeKB', N'Maximum Send Message Size (Kb)', 3, 0, NULL) +END +GO + +IF NOT EXISTS (SELECT * FROM [dbo].[Quotas] WHERE [QuotaName] = 'Exchange2007.MaxReceiveMessageSizeKB') +BEGIN +INSERT [dbo].[Quotas] ([QuotaID], [GroupID], [QuotaOrder], [QuotaName], [QuotaDescription], [QuotaTypeID], [ServiceQuota], [ItemTypeID]) VALUES (367, 12, 22, N'Exchange2007.MaxReceiveMessageSizeKB', N'Maximum Receive Message Size (Kb)', 3, 0, NULL) +END +GO + +IF NOT EXISTS (SELECT * FROM [dbo].[Quotas] WHERE [QuotaName] = 'Exchange2007.IsConsumer') +BEGIN +INSERT [dbo].[Quotas] ([QuotaID], [GroupID], [QuotaOrder], [QuotaName], [QuotaDescription], [QuotaTypeID], [ServiceQuota], [ItemTypeID]) VALUES (368, 12, 1, N'Exchange2007.IsConsumer',N'Is Consumer Organization', 1, 0, NULL) +END +GO + + + +IF NOT EXISTS (SELECT * FROM [dbo].[Providers] WHERE [DisplayName] = 'Hosted Microsoft Exchange Server 2010 SP2') +BEGIN +INSERT [dbo].[Providers] ([ProviderId], [GroupId], [ProviderName], [DisplayName], [ProviderType], [EditorControl], [DisableAutoDiscovery]) VALUES(90, 12, N'Exchange2010SP2', N'Hosted Microsoft Exchange Server 2010 SP2', N'WebsitePanel.Providers.HostedSolution.Exchange2010SP2, WebsitePanel.Providers.HostedSolution', N'Exchange', 1) +END +GO + +DELETE FROM [dbo].[HostingPlanQuotas] WHERE [QuotaID] IN (SELECT [QuotaID] FROM [dbo].[Quotas] WHERE [QuotaName] = N'Exchange2007.POP3Enabled') +DELETE FROM [dbo].[Quotas] WHERE [QuotaName] = N'Exchange2007.POP3Enabled' +DELETE FROM [dbo].[HostingPlanQuotas] WHERE [QuotaID] IN (SELECT [QuotaID] FROM [dbo].[Quotas] WHERE [QuotaName] = N'Exchange2007.IMAPEnabled') +DELETE FROM [dbo].[Quotas] WHERE [QuotaName] = N'Exchange2007.IMAPEnabled' +DELETE FROM [dbo].[HostingPlanQuotas] WHERE [QuotaID] IN (SELECT [QuotaID] FROM [dbo].[Quotas] WHERE [QuotaName] = N'Exchange2007.OWAEnabled') +DELETE FROM [dbo].[Quotas] WHERE [QuotaName] = N'Exchange2007.OWAEnabled' +DELETE FROM [dbo].[HostingPlanQuotas] WHERE [QuotaID] IN (SELECT [QuotaID] FROM [dbo].[Quotas] WHERE [QuotaName] = N'Exchange2007.MAPIEnabled') +DELETE FROM [dbo].[Quotas] WHERE [QuotaName] = N'Exchange2007.MAPIEnabled' +DELETE FROM [dbo].[HostingPlanQuotas] WHERE [QuotaID] IN (SELECT [QuotaID] FROM [dbo].[Quotas] WHERE [QuotaName] = N'Exchange2007.ActiveSyncEnabled') +DELETE FROM [dbo].[Quotas] WHERE [QuotaName] = N'Exchange2007.ActiveSyncEnabled' + + UPDATE [dbo].[ScheduleTaskParameters] SET DefaultValue = N'MsSQL2000=SQL Server 2000;MsSQL2005=SQL Server 2005;MsSQL2008=SQL Server 2008;MsSQL2012=SQL Server 2012;MySQL4=MySQL 4.0;MySQL5=MySQL 5.0' WHERE [ParameterID] = N'DATABASE_GROUP' GO @@ -1496,6 +1545,14 @@ GO UPDATE dbo.Quotas SET QuotaTypeID = 2 WHERE QuotaName = 'HostedSharePoint.Sites' GO +UPDATE dbo.Quotas SET QuotaTypeID = 2 WHERE QuotaName = 'HostedSolution.Users' +GO +UPDATE dbo.Quotas SET QuotaTypeID = 2 WHERE QuotaName = 'Exchange2007.Mailboxes' +GO +UPDATE dbo.Quotas SET QuotaTypeID = 2 WHERE QuotaName = 'Exchange2007.DiskSpace' +GO + + @@ -1527,6 +1584,1229 @@ DELETE FROM Providers WHERE ProviderID = 207 GO + +-- Remove ExchangeHostedEdition VirtualGroups +DELETE FROM VirtualGroups WHERE GroupID = 33 +GO + + + -- Remove ExchangeHostedEdition ResourceGroups DELETE FROM ResourceGroups WHERE GRoupID = 33 -GO \ No newline at end of file +GO + + +-- Create Exchange Mailbox Plans +IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[ExchangeMailboxPlans]') AND type in (N'U')) +BEGIN +CREATE TABLE [dbo].[ExchangeMailboxPlans]( + [MailboxPlanId] [int] IDENTITY(1,1) NOT NULL, + [ItemID] [int] NOT NULL, + [MailboxPlan] [nvarchar](300) COLLATE Latin1_General_CI_AS NOT NULL, + [EnableActiveSync] [bit] NOT NULL, + [EnableIMAP] [bit] NOT NULL, + [EnableMAPI] [bit] NOT NULL, + [EnableOWA] [bit] NOT NULL, + [EnablePOP] [bit] NOT NULL, + [IsDefault] [bit] NOT NULL, + [IssueWarningPct] [int] NOT NULL, + [KeepDeletedItemsDays] [int] NOT NULL, + [MailboxSizeMB] [int] NOT NULL, + [MaxReceiveMessageSizeKB] [int] NOT NULL, + [MaxRecipients] [int] NOT NULL, + [MaxSendMessageSizeKB] [int] NOT NULL, + [ProhibitSendPct] [int] NOT NULL, + [ProhibitSendReceivePct] [int] NOT NULL, + [HideFromAddressBook] [bit] NOT NULL, + CONSTRAINT [PK_ExchangeMailboxPlans] PRIMARY KEY CLUSTERED +( + [MailboxPlanId] ASC +)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] +) ON [PRIMARY] + +/****** Object: Table [dbo].[ExchangeAccounts] ******/ +ALTER TABLE [dbo].[ExchangeAccounts] WITH CHECK ADD CONSTRAINT [FK_ExchangeAccounts_ExchangeMailboxPlans] FOREIGN KEY([MailboxPlanId]) +REFERENCES [dbo].[ExchangeMailboxPlans] ([MailboxPlanId]) + +/****** Object: Table [dbo].[ExchangeAccounts] ******/ +ALTER TABLE [dbo].[ExchangeOrganizations] CHECK CONSTRAINT [FK_ExchangeOrganizations_ExchangeMailboxPlans] + +/****** Object: Table [dbo].[ExchangeAccounts] ******/ +ALTER TABLE [dbo].[ExchangeOrganizations] WITH CHECK ADD CONSTRAINT [FK_ExchangeOrganizations_ExchangeMailboxPlans] FOREIGN KEY([ItemID]) +REFERENCES [dbo].[ExchangeMailboxPlans] ([ItemID]) +ON DELETE CASCADE + +/****** Object: Table [dbo].[ExchangeAccounts] ******/ +ALTER TABLE [dbo].[ExchangeAccounts] WITH CHECK ADD CONSTRAINT [FK_ExchangeAccounts_ExchangeMailboxPlans] FOREIGN KEY([MailboxPlanId]) +REFERENCES [dbo].[ExchangeMailboxPlans] ([MailboxPlanId]) + +/****** Object: Table [dbo].[ExchangeAccounts] ******/ +ALTER TABLE dbo.ExchangeMailboxPlans ADD CONSTRAINT + IX_ExchangeMailboxPlans UNIQUE NONCLUSTERED + ( + MailboxPlanId + ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] + +/****** Object: Table [dbo].[ExchangeAccounts] ******/ +ALTER TABLE dbo.ExchangeMailboxPlans ADD CONSTRAINT + FK_ExchangeMailboxPlans_ExchangeOrganizations FOREIGN KEY + ( + ItemID + ) REFERENCES dbo.ExchangeOrganizations + ( + ItemID + ) ON UPDATE NO ACTION + ON DELETE CASCADE +END +GO + +/****** Object: Table [dbo].[ExchangeAccounts] ******/ +ALTER TABLE [dbo].[ExchangeAccounts] ALTER COLUMN [AccountName] [nvarchar](300) COLLATE Latin1_General_CI_AS NOT NULL +GO + +/****** Object: Table [dbo].[ExchangeAccounts] Extend Exchange Accounts with MailboxplanID ******/ +IF NOT EXISTS(select 1 from sys.columns COLS INNER JOIN sys.objects OBJS ON OBJS.object_id=COLS.object_id and OBJS.type='U' AND OBJS.name='ExchangeAccounts' AND COLS.name='MailboxPlanId') +BEGIN +ALTER TABLE [dbo].[ExchangeAccounts] ADD [MailboxPlanId] [int] NULL +END +GO + +/****** Object: Table [dbo].[ExchangeAccounts] Extend Exchange Accounts with SubscriberNumber ******/ +IF NOT EXISTS(select 1 from sys.columns COLS INNER JOIN sys.objects OBJS ON OBJS.object_id=COLS.object_id and OBJS.type='U' AND OBJS.name='ExchangeAccounts' AND COLS.name='SubscriberNumber') +BEGIN +ALTER TABLE [dbo].[ExchangeAccounts] ADD [SubscriberNumber] [nvarchar] (32) COLLATE Latin1_General_CI_AS NULL +END +GO + +/****** Object: Table [dbo].[ExchangeOrganizations] ******/ +ALTER TABLE [dbo].[ExchangeOrganizations] ALTER COLUMN [OrganizationID] [nvarchar](128) COLLATE Latin1_General_CI_AS NOT NULL +GO + + +/****** Object: Table [dbo].[AddExchangeAccount] ******/ +ALTER PROCEDURE [dbo].[AddExchangeAccount] +( + @AccountID int OUTPUT, + @ItemID int, + @AccountType int, + @AccountName nvarchar(300), + @DisplayName nvarchar(300), + @PrimaryEmailAddress nvarchar(300), + @MailEnabledPublicFolder bit, + @MailboxManagerActions varchar(200), + @SamAccountName nvarchar(100), + @AccountPassword nvarchar(200), + @MailboxPlanId int, + @SubscriberNumber nvarchar(32) +) +AS + +INSERT INTO ExchangeAccounts +( + ItemID, + AccountType, + AccountName, + DisplayName, + PrimaryEmailAddress, + MailEnabledPublicFolder, + MailboxManagerActions, + SamAccountName, + AccountPassword, + MailboxPlanId, + SubscriberNumber +) +VALUES +( + @ItemID, + @AccountType, + @AccountName, + @DisplayName, + @PrimaryEmailAddress, + @MailEnabledPublicFolder, + @MailboxManagerActions, + @SamAccountName, + @AccountPassword, + @MailboxPlanId, + @SubscriberNumber +) + +SET @AccountID = SCOPE_IDENTITY() + +RETURN +GO + + + + + + + +IF NOT EXISTS (SELECT * FROM sys.objects WHERE type_desc = N'SQL_STORED_PROCEDURE' AND name = N'AddExchangeMailboxPlan') +BEGIN +EXEC sp_executesql N' +CREATE PROCEDURE [dbo].[AddExchangeMailboxPlan] +( + @MailboxPlanId int OUTPUT, + @ItemID int, + @MailboxPlan nvarchar(300), + @EnableActiveSync bit, + @EnableIMAP bit, + @EnableMAPI bit, + @EnableOWA bit, + @EnablePOP bit, + @IsDefault bit, + @IssueWarningPct int, + @KeepDeletedItemsDays int, + @MailboxSizeMB int, + @MaxReceiveMessageSizeKB int, + @MaxRecipients int, + @MaxSendMessageSizeKB int, + @ProhibitSendPct int, + @ProhibitSendReceivePct int , + @HideFromAddressBook bit +) +AS + +INSERT INTO ExchangeMailboxPlans +( + ItemID, + MailboxPlan, + EnableActiveSync, + EnableIMAP, + EnableMAPI, + EnableOWA, + EnablePOP, + IsDefault, + IssueWarningPct, + KeepDeletedItemsDays, + MailboxSizeMB, + MaxReceiveMessageSizeKB, + MaxRecipients, + MaxSendMessageSizeKB, + ProhibitSendPct, + ProhibitSendReceivePct, + HideFromAddressBook +) +VALUES +( + @ItemID, + @MailboxPlan, + @EnableActiveSync, + @EnableIMAP, + @EnableMAPI, + @EnableOWA, + @EnablePOP, + @IsDefault, + @IssueWarningPct, + @KeepDeletedItemsDays, + @MailboxSizeMB, + @MaxReceiveMessageSizeKB, + @MaxRecipients, + @MaxSendMessageSizeKB, + @ProhibitSendPct, + @ProhibitSendReceivePct, + @HideFromAddressBook +) + +SET @MailboxPlanId = SCOPE_IDENTITY() + +RETURN' +END +GO + + + + + + + + + + + + + + + + + + +ALTER PROCEDURE [dbo].[AddExchangeOrganization] +( + @ItemID int, + @OrganizationID nvarchar(128) +) +AS + +IF NOT EXISTS(SELECT * FROM ExchangeOrganizations WHERE OrganizationID = @OrganizationID) +BEGIN + INSERT INTO ExchangeOrganizations + (ItemID, OrganizationID) + VALUES + (@ItemID, @OrganizationID) +END + +RETURN +GO + + + + + + + + + + + + +ALTER FUNCTION [dbo].[CalculateQuotaUsage] +( + @PackageID int, + @QuotaID int +) +RETURNS int +AS + BEGIN + + DECLARE @QuotaTypeID int + SELECT @QuotaTypeID = QuotaTypeID FROM Quotas + WHERE QuotaID = @QuotaID + + IF @QuotaTypeID <> 2 + RETURN 0 + + DECLARE @Result int + + IF @QuotaID = 52 -- diskspace + SET @Result = dbo.CalculatePackageDiskspace(@PackageID) + ELSE IF @QuotaID = 51 -- bandwidth + SET @Result = dbo.CalculatePackageBandwidth(@PackageID) + ELSE IF @QuotaID = 53 -- domains + SET @Result = (SELECT COUNT(D.DomainID) FROM PackagesTreeCache AS PT + INNER JOIN Domains AS D ON D.PackageID = PT.PackageID + WHERE IsSubDomain = 0 AND IsInstantAlias = 0 AND IsDomainPointer = 0 AND PT.ParentPackageID = @PackageID) + ELSE IF @QuotaID = 54 -- sub-domains + SET @Result = (SELECT COUNT(D.DomainID) FROM PackagesTreeCache AS PT + INNER JOIN Domains AS D ON D.PackageID = PT.PackageID + WHERE IsSubDomain = 1 AND IsInstantAlias = 0 AND PT.ParentPackageID = @PackageID) + ELSE IF @QuotaID = 220 -- domain pointers + SET @Result = (SELECT COUNT(D.DomainID) FROM PackagesTreeCache AS PT + INNER JOIN Domains AS D ON D.PackageID = PT.PackageID + WHERE IsDomainPointer = 1 AND PT.ParentPackageID = @PackageID) + ELSE IF @QuotaID = 71 -- scheduled tasks + SET @Result = (SELECT COUNT(S.ScheduleID) FROM PackagesTreeCache AS PT + INNER JOIN Schedule AS S ON S.PackageID = PT.PackageID + WHERE PT.ParentPackageID = @PackageID) + ELSE IF @QuotaID = 305 -- RAM of VPS + SET @Result = (SELECT SUM(CAST(SIP.PropertyValue AS int)) FROM ServiceItemProperties AS SIP + INNER JOIN ServiceItems AS SI ON SIP.ItemID = SI.ItemID + INNER JOIN PackagesTreeCache AS PT ON SI.PackageID = PT.PackageID + WHERE SIP.PropertyName = 'RamSize' AND PT.ParentPackageID = @PackageID) + ELSE IF @QuotaID = 306 -- HDD of VPS + SET @Result = (SELECT SUM(CAST(SIP.PropertyValue AS int)) FROM ServiceItemProperties AS SIP + INNER JOIN ServiceItems AS SI ON SIP.ItemID = SI.ItemID + INNER JOIN PackagesTreeCache AS PT ON SI.PackageID = PT.PackageID + WHERE SIP.PropertyName = 'HddSize' AND PT.ParentPackageID = @PackageID) + ELSE IF @QuotaID = 309 -- External IP addresses of VPS + SET @Result = (SELECT COUNT(PIP.PackageAddressID) FROM PackageIPAddresses AS PIP + INNER JOIN IPAddresses AS IP ON PIP.AddressID = IP.AddressID + INNER JOIN PackagesTreeCache AS PT ON PIP.PackageID = PT.PackageID + WHERE PT.ParentPackageID = @PackageID AND IP.PoolID = 3) + ELSE IF @QuotaID = 100 -- Dedicated Web IP addresses + SET @Result = (SELECT COUNT(PIP.PackageAddressID) FROM PackageIPAddresses AS PIP + INNER JOIN IPAddresses AS IP ON PIP.AddressID = IP.AddressID + INNER JOIN PackagesTreeCache AS PT ON PIP.PackageID = PT.PackageID + WHERE PT.ParentPackageID = @PackageID AND IP.PoolID = 2) + ELSE IF @QuotaID = 350 -- RAM of VPSforPc + SET @Result = (SELECT SUM(CAST(SIP.PropertyValue AS int)) FROM ServiceItemProperties AS SIP + INNER JOIN ServiceItems AS SI ON SIP.ItemID = SI.ItemID + INNER JOIN PackagesTreeCache AS PT ON SI.PackageID = PT.PackageID + WHERE SIP.PropertyName = 'Memory' AND PT.ParentPackageID = @PackageID) + ELSE IF @QuotaID = 351 -- HDD of VPSforPc + SET @Result = (SELECT SUM(CAST(SIP.PropertyValue AS int)) FROM ServiceItemProperties AS SIP + INNER JOIN ServiceItems AS SI ON SIP.ItemID = SI.ItemID + INNER JOIN PackagesTreeCache AS PT ON SI.PackageID = PT.PackageID + WHERE SIP.PropertyName = 'HddSize' AND PT.ParentPackageID = @PackageID) + ELSE IF @QuotaID = 354 -- External IP addresses of VPSforPc + SET @Result = (SELECT COUNT(PIP.PackageAddressID) FROM PackageIPAddresses AS PIP + INNER JOIN IPAddresses AS IP ON PIP.AddressID = IP.AddressID + INNER JOIN PackagesTreeCache AS PT ON PIP.PackageID = PT.PackageID + WHERE PT.ParentPackageID = @PackageID AND IP.PoolID = 3) + ELSE IF @QuotaID = 319 -- BB Users + SET @Result = (SELECT COUNT(ea.AccountID) FROM ExchangeAccounts ea + INNER JOIN BlackBerryUsers bu ON ea.AccountID = bu.AccountID + INNER JOIN ServiceItems si ON ea.ItemID = si.ItemID + INNER JOIN PackagesTreeCache pt ON si.PackageID = pt.PackageID + WHERE pt.ParentPackageID = @PackageID) + ELSE IF @QuotaID = 206 -- HostedSolution.Users + SET @Result = (SELECT COUNT(ea.AccountID) FROM ExchangeAccounts AS ea + INNER JOIN ServiceItems si ON ea.ItemID = si.ItemID + INNER JOIN PackagesTreeCache pt ON si.PackageID = pt.PackageID + WHERE pt.ParentPackageID = @PackageID AND ea.AccountType IN (1,5,6,7)) + ELSE IF @QuotaID = 78 -- Exchange2007.Mailboxes + SET @Result = (SELECT COUNT(ea.AccountID) FROM ExchangeAccounts AS ea + INNER JOIN ServiceItems si ON ea.ItemID = si.ItemID + INNER JOIN PackagesTreeCache pt ON si.PackageID = pt.PackageID + WHERE pt.ParentPackageID = @PackageID AND ea.MailboxPlanId IS NOT NULL) + ELSE IF @QuotaID = 77 -- Exchange2007.DiskSpace + SET @Result = (SELECT SUM(B.MailboxSizeMB) FROM ExchangeAccounts AS ea + INNER JOIN ExchangeMailboxPlans AS B ON ea.MailboxPlanId = B.MailboxPlanId + INNER JOIN ServiceItems si ON ea.ItemID = si.ItemID + INNER JOIN PackagesTreeCache pt ON si.PackageID = pt.PackageID + WHERE pt.ParentPackageID = @PackageID) + ELSE + SET @Result = (SELECT COUNT(SI.ItemID) FROM Quotas AS Q + INNER JOIN ServiceItems AS SI ON SI.ItemTypeID = Q.ItemTypeID + INNER JOIN PackagesTreeCache AS PT ON SI.PackageID = PT.PackageID AND PT.ParentPackageID = @PackageID + WHERE Q.QuotaID = @QuotaID) + + RETURN @Result + END + +GO + + + + + + + + + + +IF NOT EXISTS (SELECT * FROM sys.objects WHERE type_desc = N'SQL_STORED_PROCEDURE' AND name = N'DeleteExchangeMailboxPlan') +BEGIN +EXEC sp_executesql N' +CREATE PROCEDURE [dbo].[DeleteExchangeMailboxPlan] +( + @MailboxPlanId int +) +AS + +-- delete mailboxplan +DELETE FROM ExchangeMailboxPlans +WHERE MailboxPlanId = @MailboxPlanId + +RETURN' +END +GO + + + + + + + + + + + + + + +ALTER PROCEDURE [dbo].[DeleteExchangeOrganization] +( + @ItemID int +) +AS +BEGIN TRAN + DELETE FROM ExchangeMailboxPlans WHERE ItemID = @ItemID + DELETE FROM ExchangeOrganizations WHERE ItemID = @ItemID +COMMIT TRAN +RETURN +GO + + + + + + + + + + + +ALTER PROCEDURE [dbo].[ExchangeAccountExists] +( + @AccountName nvarchar(20), + @Exists bit OUTPUT +) +AS +SET @Exists = 0 +IF EXISTS(SELECT * FROM ExchangeAccounts WHERE sAMAccountName LIKE '%\'+@AccountName) +BEGIN + SET @Exists = 1 +END + +RETURN + +GO + + + + + + + + + + + + +ALTER PROCEDURE [dbo].[GetExchangeAccounts] +( + @ItemID int, + @AccountType int +) +AS +SELECT + E.AccountID, + E.ItemID, + E.AccountType, + E.AccountName, + E.DisplayName, + E.PrimaryEmailAddress, + E.MailEnabledPublicFolder, + E.MailboxPlanId, + P.MailboxPlan, + E.SubscriberNumber +FROM + ExchangeAccounts AS E +INNER JOIN ExchangeMailboxPlans AS P ON E.MailboxPlanId = P.MailboxPlanId +WHERE + E.ItemID = @ItemID AND + (E.AccountType = @AccountType OR @AccountType IS NULL) +ORDER BY DisplayName +RETURN + +GO + + + + + + + + + + +ALTER PROCEDURE [dbo].[GetExchangeAccountsPaged] +( + @ActorID int, + @ItemID int, + @AccountTypes nvarchar(30), + @FilterColumn nvarchar(50) = '', + @FilterValue nvarchar(50) = '', + @SortColumn nvarchar(50), + @StartRow int, + @MaximumRows int +) +AS + +DECLARE @PackageID int +SELECT @PackageID = PackageID FROM ServiceItems +WHERE ItemID = @ItemID + +-- check rights +IF dbo.CheckActorPackageRights(@ActorID, @PackageID) = 0 +RAISERROR('You are not allowed to access this package', 16, 1) + +-- start +DECLARE @condition nvarchar(700) +SET @condition = ' +EA.AccountType IN (' + @AccountTypes + ') +AND EA.ItemID = @ItemID +' + +IF @FilterColumn <> '' AND @FilterColumn IS NOT NULL +AND @FilterValue <> '' AND @FilterValue IS NOT NULL +BEGIN + IF @FilterColumn = 'PrimaryEmailAddress' AND @AccountTypes <> '2' + BEGIN + SET @condition = @condition + ' AND EA.AccountID IN (SELECT EAEA.AccountID FROM ExchangeAccountEmailAddresses EAEA WHERE EAEA.EmailAddress LIKE ''' + @FilterValue + ''')' + END + ELSE + BEGIN + SET @condition = @condition + ' AND ' + @FilterColumn + ' LIKE ''' + @FilterValue + '''' + END +END + +IF @SortColumn IS NULL OR @SortColumn = '' +SET @SortColumn = 'EA.DisplayName ASC' + +DECLARE @joincondition nvarchar(700) + SET @joincondition = ',P.MailboxPlan FROM ExchangeAccounts AS EA + LEFT OUTER JOIN ExchangeMailboxPlans AS P ON EA.MailboxPlanId = P.MailboxPlanId' + +DECLARE @sql nvarchar(3500) + +set @sql = ' +SELECT COUNT(EA.AccountID) FROM ExchangeAccounts AS EA +WHERE ' + @condition + '; + +WITH Accounts AS ( + SELECT ROW_NUMBER() OVER (ORDER BY ' + @SortColumn + ') as Row, + EA.AccountID, + EA.ItemID, + EA.AccountType, + EA.AccountName, + EA.DisplayName, + EA.PrimaryEmailAddress, + EA.MailEnabledPublicFolder, + EA.MailboxPlanId, + EA.SubscriberNumber ' + @joincondition + + ' WHERE ' + @condition + ' +) + +SELECT * FROM Accounts +WHERE Row BETWEEN @StartRow + 1 and @StartRow + @MaximumRows +' + +print @sql + +exec sp_executesql @sql, N'@ItemID int, @StartRow int, @MaximumRows int', +@ItemID, @StartRow, @MaximumRows + +RETURN + + + + +GO + + + + + + + + + +IF NOT EXISTS (SELECT * FROM sys.objects WHERE type_desc = N'SQL_STORED_PROCEDURE' AND name = N'GetExchangeAccountByAccountName') +BEGIN +EXEC sp_executesql N'CREATE PROCEDURE [dbo].[GetExchangeAccountByAccountName] +( + @ItemID int, + @AccountName nvarchar(300) +) +AS +SELECT + E.AccountID, + E.ItemID, + E.AccountType, + E.AccountName, + E.DisplayName, + E.PrimaryEmailAddress, + E.MailEnabledPublicFolder, + E.MailboxManagerActions, + E.SamAccountName, + E.AccountPassword, + E.MailboxPlanId, + P.MailboxPlan, + E.SubscriberNumber +FROM + ExchangeAccounts AS E +LEFT OUTER JOIN ExchangeMailboxPlans AS P ON E.MailboxPlanId = P.MailboxPlanId +WHERE + E.ItemID = @ItemID AND + E.AccountName = @AccountName +RETURN' +END +GO + + + + + + + + + + +IF NOT EXISTS (SELECT * FROM sys.objects WHERE type_desc = N'SQL_STORED_PROCEDURE' AND name = N'GetExchangeMailboxPlan') +BEGIN +EXEC sp_executesql N' CREATE PROCEDURE [dbo].[GetExchangeMailboxPlan] +( + @MailboxPlanId int +) +AS +SELECT + MailboxPlanId, + ItemID, + MailboxPlan, + EnableActiveSync, + EnableIMAP, + EnableMAPI, + EnableOWA, + EnablePOP, + IsDefault, + IssueWarningPct, + KeepDeletedItemsDays, + MailboxSizeMB, + MaxReceiveMessageSizeKB, + MaxRecipients, + MaxSendMessageSizeKB, + ProhibitSendPct, + ProhibitSendReceivePct, + HideFromAddressBook +FROM + ExchangeMailboxPlans +WHERE + MailboxPlanId = @MailboxPlanId +RETURN' +END +GO + + + + + + + + + + + + + + + + + + + +IF NOT EXISTS (SELECT * FROM sys.objects WHERE type_desc = N'SQL_STORED_PROCEDURE' AND name = N'GetExchangeMailboxPlans') +BEGIN +EXEC sp_executesql N'CREATE PROCEDURE [dbo].[GetExchangeMailboxPlans] +( + @ItemID int +) +AS +SELECT + MailboxPlanId, + ItemID, + MailboxPlan, + EnableActiveSync, + EnableIMAP, + EnableMAPI, + EnableOWA, + EnablePOP, + IsDefault, + IssueWarningPct, + KeepDeletedItemsDays, + MailboxSizeMB, + MaxReceiveMessageSizeKB, + MaxRecipients, + MaxSendMessageSizeKB, + ProhibitSendPct, + ProhibitSendReceivePct, + HideFromAddressBook +FROM + ExchangeMailboxPlans +WHERE + ItemID = @ItemID +ORDER BY MailboxPlan +RETURN' +END +GO + + + + + + + + + + + + + + + + + + + +ALTER PROCEDURE [dbo].[GetExchangeOrganizationStatistics] +( + @ItemID int +) +AS +SELECT + (SELECT COUNT(*) FROM ExchangeAccounts WHERE (AccountType = 1 OR AccountType = 5 OR AccountType = 6) AND ItemID = @ItemID) AS CreatedMailboxes, + (SELECT COUNT(*) FROM ExchangeAccounts WHERE AccountType = 2 AND ItemID = @ItemID) AS CreatedContacts, + (SELECT COUNT(*) FROM ExchangeAccounts WHERE AccountType = 3 AND ItemID = @ItemID) AS CreatedDistributionLists, + (SELECT COUNT(*) FROM ExchangeAccounts WHERE AccountType = 4 AND ItemID = @ItemID) AS CreatedPublicFolders, + (SELECT COUNT(*) FROM ExchangeOrganizationDomains WHERE ItemID = @ItemID) AS CreatedDomains, + (SELECT SUM(B.MailboxSizeMB) FROM ExchangeAccounts AS A INNER JOIN ExchangeMailboxPlans AS B ON A.MailboxPlanId = B.MailboxPlanId WHERE A.ItemID=@ItemID) AS UsedDiskSpace + +RETURN +GO + + + + + + + + + + + + + + + + + + + + +ALTER PROCEDURE [dbo].[GetPackages] +( + @ActorID int, + @UserID int +) +AS + +IF dbo.CheckActorUserRights(@ActorID, @UserID) = 0 +RAISERROR('You are not allowed to access this account', 16, 1) + +SELECT + P.PackageID, + P.ParentPackageID, + P.PackageName, + P.StatusID, + P.PurchaseDate, + + -- server + ISNULL(P.ServerID, 0) AS ServerID, + ISNULL(S.ServerName, 'None') AS ServerName, + ISNULL(S.Comments, '') AS ServerComments, + ISNULL(S.VirtualServer, 1) AS VirtualServer, + + -- hosting plan + P.PlanID, + HP.PlanName, + + -- user + P.UserID, + U.Username, + U.FirstName, + U.LastName, + U.RoleID, + U.Email +FROM Packages AS P +INNER JOIN Users AS U ON P.UserID = U.UserID +INNER JOIN Servers AS S ON P.ServerID = S.ServerID +INNER JOIN HostingPlans AS HP ON P.PlanID = HP.PlanID +WHERE + P.UserID = @UserID +RETURN + +GO + + + + + + + + + + +IF NOT EXISTS (SELECT * FROM sys.objects WHERE type_desc = N'SQL_STORED_PROCEDURE' AND name = N'SetExchangeAccountMailboxplan') +BEGIN +EXEC sp_executesql N'CREATE PROCEDURE [dbo].[SetExchangeAccountMailboxplan] +( + @AccountID int, + @MailboxPlanId int +) +AS + +UPDATE ExchangeAccounts SET + MailboxPlanId = @MailboxPlanId +WHERE + AccountID = @AccountID + +RETURN' +END +GO + + + + + + + + + + + + + +IF NOT EXISTS (SELECT * FROM sys.objects WHERE type_desc = N'SQL_STORED_PROCEDURE' AND name = N'SetOrganizationDefaultExchangeMailboxPlan') +BEGIN +EXEC sp_executesql N'CREATE PROCEDURE [dbo].[SetOrganizationDefaultExchangeMailboxPlan] +( + @ItemId int, + @MailboxPlanId int +) +AS + +UPDATE ExchangeMailboxPlans SET IsDefault=0 WHERE ItemId=@ItemId +UPDATE ExchangeMailboxPlans SET IsDefault=1 WHERE MailboxPlanId=@MailboxPlanId + +RETURN' +END +GO + + + + + + + + + + + + + + + + + + +ALTER PROCEDURE [dbo].[UpdateExchangeAccount] +( + @AccountID int, + @AccountName nvarchar(300), + @DisplayName nvarchar(300), + @PrimaryEmailAddress nvarchar(300), + @AccountType int, + @SamAccountName nvarchar(100), + @MailEnabledPublicFolder bit, + @MailboxManagerActions varchar(200), + @Password varchar(200), + @MailboxPlanId int, + @SubscriberNumber varchar(32) +) +AS + +BEGIN TRAN + +IF (@MailboxPlanId = -1) +BEGIN + SET @MailboxPlanId = NULL +END + +UPDATE ExchangeAccounts SET + AccountName = @AccountName, + DisplayName = @DisplayName, + PrimaryEmailAddress = @PrimaryEmailAddress, + MailEnabledPublicFolder = @MailEnabledPublicFolder, + MailboxManagerActions = @MailboxManagerActions, + AccountType =@AccountType, + SamAccountName = @SamAccountName, + MailboxPlanId = @MailboxPlanId, + SubscriberNumber = @SubscriberNumber + +WHERE + AccountID = @AccountID + +IF (@@ERROR <> 0 ) + BEGIN + ROLLBACK TRANSACTION + RETURN -1 + END + +UPDATE ExchangeAccounts SET + AccountPassword = @Password WHERE AccountID = @AccountID AND @Password IS NOT NULL + +IF (@@ERROR <> 0 ) + BEGIN + ROLLBACK TRANSACTION + RETURN -1 + END +COMMIT TRAN +RETURN +GO + + + + + + + + + + +ALTER PROCEDURE [dbo].[GetExchangeAccount] +( + @ItemID int, + @AccountID int +) +AS +SELECT + E.AccountID, + E.ItemID, + E.AccountType, + E.AccountName, + E.DisplayName, + E.PrimaryEmailAddress, + E.MailEnabledPublicFolder, + E.MailboxManagerActions, + E.SamAccountName, + E.AccountPassword, + E.MailboxPlanId, + P.MailboxPlan, + E.SubscriberNumber +FROM + ExchangeAccounts AS E +LEFT OUTER JOIN ExchangeMailboxPlans AS P ON E.MailboxPlanId = P.MailboxPlanId +WHERE + E.ItemID = @ItemID AND + E.AccountID = @AccountID +RETURN +GO + + + + + + + + + +ALTER PROCEDURE [dbo].[GetExchangeMailboxes] + @ItemID int +AS +BEGIN +SELECT + AccountID, + ItemID, + AccountType, + AccountName, + DisplayName, + PrimaryEmailAddress, + MailEnabledPublicFolder, + SubscriberNumber +FROM + ExchangeAccounts +WHERE + ItemID = @ItemID AND + (AccountType =1 OR AccountType=5 OR AccountType=6) +ORDER BY 1 + +END + +GO + + + + + + + + + + + + +ALTER PROCEDURE [dbo].[SearchExchangeAccount] +( + @ActorID int, + @AccountType int, + @PrimaryEmailAddress nvarchar(300) +) +AS + +DECLARE @PackageID int +DECLARE @ItemID int +DECLARE @AccountID int + +SELECT + @AccountID = AccountID, + @ItemID = ItemID +FROM ExchangeAccounts +WHERE PrimaryEmailAddress = @PrimaryEmailAddress +AND AccountType = @AccountType + + +-- check space rights +SELECT @PackageID = PackageID FROM ServiceItems +WHERE ItemID = @ItemID + +IF dbo.CheckActorPackageRights(@ActorID, @PackageID) = 0 +RAISERROR('You are not allowed to access this package', 16, 1) + +SELECT + AccountID, + ItemID, + @PackageID AS PackageID, + AccountType, + AccountName, + DisplayName, + PrimaryEmailAddress, + MailEnabledPublicFolder, + MailboxManagerActions, + SamAccountName, + AccountPassword, + SubscriberNumber +FROM ExchangeAccounts +WHERE AccountID = @AccountID + +RETURN + +GO + + + + + + + + + + + +ALTER PROCEDURE [dbo].[SearchExchangeAccounts] +( + @ActorID int, + @ItemID int, + @IncludeMailboxes bit, + @IncludeContacts bit, + @IncludeDistributionLists bit, + @IncludeRooms bit, + @IncludeEquipment bit, + @FilterColumn nvarchar(50) = '', + @FilterValue nvarchar(50) = '', + @SortColumn nvarchar(50) +) +AS +DECLARE @PackageID int +SELECT @PackageID = PackageID FROM ServiceItems +WHERE ItemID = @ItemID + +-- check rights +IF dbo.CheckActorPackageRights(@ActorID, @PackageID) = 0 +RAISERROR('You are not allowed to access this package', 16, 1) + +-- start +DECLARE @condition nvarchar(700) +SET @condition = ' +((@IncludeMailboxes = 1 AND EA.AccountType = 1) +OR (@IncludeContacts = 1 AND EA.AccountType = 2) +OR (@IncludeDistributionLists = 1 AND EA.AccountType = 3) +OR (@IncludeRooms = 1 AND EA.AccountType = 5) +OR (@IncludeEquipment = 1 AND EA.AccountType = 6)) +AND EA.ItemID = @ItemID +' + +IF @FilterColumn <> '' AND @FilterColumn IS NOT NULL +AND @FilterValue <> '' AND @FilterValue IS NOT NULL +SET @condition = @condition + ' AND ' + @FilterColumn + ' LIKE ''' + @FilterValue + '''' + +IF @SortColumn IS NULL OR @SortColumn = '' +SET @SortColumn = 'EA.DisplayName ASC' + +DECLARE @sql nvarchar(3500) + +set @sql = ' +SELECT + EA.AccountID, + EA.ItemID, + EA.AccountType, + EA.AccountName, + EA.DisplayName, + EA.PrimaryEmailAddress, + EA.MailEnabledPublicFolder, + EA.SubscriberNumber +FROM ExchangeAccounts AS EA +WHERE ' + @condition + +print @sql + +exec sp_executesql @sql, N'@ItemID int, @IncludeMailboxes int, @IncludeContacts int, + @IncludeDistributionLists int, @IncludeRooms bit, @IncludeEquipment bit', +@ItemID, @IncludeMailboxes, @IncludeContacts, @IncludeDistributionLists, @IncludeRooms, @IncludeEquipment + +RETURN + +GO + + + + + + + + + + + + + + + + + + +ALTER PROCEDURE [dbo].[SearchOrganizationAccounts] +( + @ActorID int, + @ItemID int, + @FilterColumn nvarchar(50) = '', + @FilterValue nvarchar(50) = '', + @SortColumn nvarchar(50), + @IncludeMailboxes bit +) +AS +DECLARE @PackageID int +SELECT @PackageID = PackageID FROM ServiceItems +WHERE ItemID = @ItemID + +-- check rights +IF dbo.CheckActorPackageRights(@ActorID, @PackageID) = 0 +RAISERROR('You are not allowed to access this package', 16, 1) + +-- start +DECLARE @condition nvarchar(700) +SET @condition = ' +(EA.AccountType = 7 OR (EA.AccountType = 1 AND @IncludeMailboxes = 1) ) +AND EA.ItemID = @ItemID +' + +IF @FilterColumn <> '' AND @FilterColumn IS NOT NULL +AND @FilterValue <> '' AND @FilterValue IS NOT NULL +SET @condition = @condition + ' AND ' + @FilterColumn + ' LIKE ''' + @FilterValue + '''' + +IF @SortColumn IS NULL OR @SortColumn = '' +SET @SortColumn = 'EA.DisplayName ASC' + +DECLARE @sql nvarchar(3500) + +set @sql = ' +SELECT + EA.AccountID, + EA.ItemID, + EA.AccountType, + EA.AccountName, + EA.DisplayName, + EA.PrimaryEmailAddress, + EA.SubscriberNumber +FROM ExchangeAccounts AS EA +WHERE ' + @condition + +print @sql + +exec sp_executesql @sql, N'@ItemID int, @IncludeMailboxes bit', +@ItemID, @IncludeMailboxes + +RETURN + + + diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Base/Packages/Quotas.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Base/Packages/Quotas.cs index 98a45a86..8a242db2 100644 --- a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Base/Packages/Quotas.cs +++ b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Base/Packages/Quotas.cs @@ -105,6 +105,11 @@ order by rg.groupOrder public const string EXCHANGE2007_OWAENABLED = "Exchange2007.OWAEnabled"; // OWA Enabled by default public const string EXCHANGE2007_MAPIENABLED = "Exchange2007.MAPIEnabled"; // MAPI Enabled by default public const string EXCHANGE2007_ACTIVESYNCENABLED = "Exchange2007.ActiveSyncEnabled"; // ActiveSync Enabled by default + public const string EXCHANGE2007_KEEPDELETEDITEMSDAYS = "Exchange2007.KeepDeletedItemsDays"; // Keep deleted items + public const string EXCHANGE2007_MAXRECIPIENTS = "Exchange2007.MaxRecipients"; // Max Recipients + public const string EXCHANGE2007_MAXSENDMESSAGESIZEKB = "Exchange2007.MaxSendMessageSizeKB"; // Max Send Message Size + public const string EXCHANGE2007_MAXRECEIVEMESSAGESIZEKB = "Exchange2007.MaxReceiveMessageSizeKB"; // Max Receive Message Size + public const string EXCHANGE2007_ISCONSUMER = "Exchange2007.IsConsumer"; // Is Consumer Organization public const string MSSQL2000_DATABASES = "MsSQL2000.Databases"; // Databases public const string MSSQL2000_USERS = "MsSQL2000.Users"; // Users public const string MSSQL2000_MAXDATABASESIZE = "MsSQL2000.MaxDatabaseSize"; // Max Database Size diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Client/ExchangeServerProxy.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Client/ExchangeServerProxy.cs index 05e81557..99410a39 100644 --- a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Client/ExchangeServerProxy.cs +++ b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Client/ExchangeServerProxy.cs @@ -1,31 +1,3 @@ -// Copyright (c) 2012, Outercurve Foundation. -// All rights reserved. -// -// Redistribution and use in source and binary forms, with or without modification, -// are permitted provided that the following conditions are met: -// -// - Redistributions of source code must retain the above copyright notice, this -// list of conditions and the following disclaimer. -// -// - Redistributions in binary form must reproduce the above copyright notice, -// this list of conditions and the following disclaimer in the documentation -// and/or other materials provided with the distribution. -// -// - Neither the name of the Outercurve Foundation nor the names of its -// contributors may be used to endorse or promote products derived from this -// software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR -// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON -// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - //------------------------------------------------------------------------------ // // This code was generated by a tool. @@ -39,8 +11,7 @@ // // This source code was auto-generated by wsdl, Version=2.0.50727.42. // -namespace WebsitePanel.EnterpriseServer -{ +namespace WebsitePanel.EnterpriseServer { using System.Xml.Serialization; using System.Web.Services; using System.ComponentModel; @@ -49,10 +20,12 @@ namespace WebsitePanel.EnterpriseServer using System.Diagnostics; using System.Data; + using WebsitePanel.Providers; using WebsitePanel.Providers.Common; using WebsitePanel.Providers.HostedSolution; using WebsitePanel.Providers.ResultObjects; + /// @@ -60,31 +33,10 @@ namespace WebsitePanel.EnterpriseServer [System.Diagnostics.DebuggerStepThroughAttribute()] [System.ComponentModel.DesignerCategoryAttribute("code")] [System.Web.Services.WebServiceBindingAttribute(Name="esExchangeServerSoap", Namespace="http://smbsaas/websitepanel/enterpriseserver")] + [System.Xml.Serialization.XmlIncludeAttribute(typeof(BaseStatistics))] [System.Xml.Serialization.XmlIncludeAttribute(typeof(ServiceProviderItem))] public partial class esExchangeServer : Microsoft.Web.Services3.WebServicesClientProtocol { - private System.Threading.SendOrPostCallback GetPublicFolderMailFlowSettingsOperationCompleted; - - private System.Threading.SendOrPostCallback SetPublicFolderMailFlowSettingsOperationCompleted; - - private System.Threading.SendOrPostCallback GetPublicFolderEmailAddressesOperationCompleted; - - private System.Threading.SendOrPostCallback AddPublicFolderEmailAddressOperationCompleted; - - private System.Threading.SendOrPostCallback SetPublicFolderPrimaryEmailAddressOperationCompleted; - - private System.Threading.SendOrPostCallback DeletePublicFolderEmailAddressesOperationCompleted; - - private System.Threading.SendOrPostCallback GetMobileDevicesOperationCompleted; - - private System.Threading.SendOrPostCallback GetMobileDeviceOperationCompleted; - - private System.Threading.SendOrPostCallback WipeDataFromDeviceOperationCompleted; - - private System.Threading.SendOrPostCallback CancelRemoteWipeRequestOperationCompleted; - - private System.Threading.SendOrPostCallback RemoveDeviceOperationCompleted; - private System.Threading.SendOrPostCallback GetRawExchangeOrganizationsPagedOperationCompleted; private System.Threading.SendOrPostCallback GetExchangeOrganizationsPagedOperationCompleted; @@ -103,7 +55,7 @@ namespace WebsitePanel.EnterpriseServer private System.Threading.SendOrPostCallback GetMailboxesStatisticsOperationCompleted; - private System.Threading.SendOrPostCallback GetPublicFoldersStatisticsOperationCompleted; + private System.Threading.SendOrPostCallback GetMailboxStatisticsOperationCompleted; private System.Threading.SendOrPostCallback CalculateOrganizationDiskspaceOperationCompleted; @@ -149,9 +101,7 @@ namespace WebsitePanel.EnterpriseServer private System.Threading.SendOrPostCallback SetMailboxMailFlowSettingsOperationCompleted; - private System.Threading.SendOrPostCallback GetMailboxAdvancedSettingsOperationCompleted; - - private System.Threading.SendOrPostCallback SetMailboxAdvancedSettingsOperationCompleted; + private System.Threading.SendOrPostCallback SetExchangeMailboxPlanOperationCompleted; private System.Threading.SendOrPostCallback GetMailboxSetupInstructionsOperationCompleted; @@ -199,6 +149,26 @@ namespace WebsitePanel.EnterpriseServer private System.Threading.SendOrPostCallback GetDistributionListPermissionsOperationCompleted; + private System.Threading.SendOrPostCallback GetMobileDevicesOperationCompleted; + + private System.Threading.SendOrPostCallback GetMobileDeviceOperationCompleted; + + private System.Threading.SendOrPostCallback WipeDataFromDeviceOperationCompleted; + + private System.Threading.SendOrPostCallback CancelRemoteWipeRequestOperationCompleted; + + private System.Threading.SendOrPostCallback RemoveDeviceOperationCompleted; + + private System.Threading.SendOrPostCallback GetExchangeMailboxPlansOperationCompleted; + + private System.Threading.SendOrPostCallback GetExchangeMailboxPlanOperationCompleted; + + private System.Threading.SendOrPostCallback AddExchangeMailboxPlanOperationCompleted; + + private System.Threading.SendOrPostCallback DeleteExchangeMailboxPlanOperationCompleted; + + private System.Threading.SendOrPostCallback SetOrganizationDefaultExchangeMailboxPlanOperationCompleted; + private System.Threading.SendOrPostCallback CreatePublicFolderOperationCompleted; private System.Threading.SendOrPostCallback DeletePublicFoldersOperationCompleted; @@ -213,44 +183,23 @@ namespace WebsitePanel.EnterpriseServer private System.Threading.SendOrPostCallback SetPublicFolderGeneralSettingsOperationCompleted; + private System.Threading.SendOrPostCallback GetPublicFolderMailFlowSettingsOperationCompleted; + + private System.Threading.SendOrPostCallback SetPublicFolderMailFlowSettingsOperationCompleted; + + private System.Threading.SendOrPostCallback GetPublicFolderEmailAddressesOperationCompleted; + + private System.Threading.SendOrPostCallback AddPublicFolderEmailAddressOperationCompleted; + + private System.Threading.SendOrPostCallback SetPublicFolderPrimaryEmailAddressOperationCompleted; + + private System.Threading.SendOrPostCallback DeletePublicFolderEmailAddressesOperationCompleted; + /// public esExchangeServer() { this.Url = "http://localhost:9005/esExchangeServer.asmx"; } - /// - public event GetPublicFolderMailFlowSettingsCompletedEventHandler GetPublicFolderMailFlowSettingsCompleted; - - /// - public event SetPublicFolderMailFlowSettingsCompletedEventHandler SetPublicFolderMailFlowSettingsCompleted; - - /// - public event GetPublicFolderEmailAddressesCompletedEventHandler GetPublicFolderEmailAddressesCompleted; - - /// - public event AddPublicFolderEmailAddressCompletedEventHandler AddPublicFolderEmailAddressCompleted; - - /// - public event SetPublicFolderPrimaryEmailAddressCompletedEventHandler SetPublicFolderPrimaryEmailAddressCompleted; - - /// - public event DeletePublicFolderEmailAddressesCompletedEventHandler DeletePublicFolderEmailAddressesCompleted; - - /// - public event GetMobileDevicesCompletedEventHandler GetMobileDevicesCompleted; - - /// - public event GetMobileDeviceCompletedEventHandler GetMobileDeviceCompleted; - - /// - public event WipeDataFromDeviceCompletedEventHandler WipeDataFromDeviceCompleted; - - /// - public event CancelRemoteWipeRequestCompletedEventHandler CancelRemoteWipeRequestCompleted; - - /// - public event RemoveDeviceCompletedEventHandler RemoveDeviceCompleted; - /// public event GetRawExchangeOrganizationsPagedCompletedEventHandler GetRawExchangeOrganizationsPagedCompleted; @@ -279,7 +228,7 @@ namespace WebsitePanel.EnterpriseServer public event GetMailboxesStatisticsCompletedEventHandler GetMailboxesStatisticsCompleted; /// - public event GetPublicFoldersStatisticsCompletedEventHandler GetPublicFoldersStatisticsCompleted; + public event GetMailboxStatisticsCompletedEventHandler GetMailboxStatisticsCompleted; /// public event CalculateOrganizationDiskspaceCompletedEventHandler CalculateOrganizationDiskspaceCompleted; @@ -348,10 +297,7 @@ namespace WebsitePanel.EnterpriseServer public event SetMailboxMailFlowSettingsCompletedEventHandler SetMailboxMailFlowSettingsCompleted; /// - public event GetMailboxAdvancedSettingsCompletedEventHandler GetMailboxAdvancedSettingsCompleted; - - /// - public event SetMailboxAdvancedSettingsCompletedEventHandler SetMailboxAdvancedSettingsCompleted; + public event SetExchangeMailboxPlanCompletedEventHandler SetExchangeMailboxPlanCompleted; /// public event GetMailboxSetupInstructionsCompletedEventHandler GetMailboxSetupInstructionsCompleted; @@ -422,6 +368,36 @@ namespace WebsitePanel.EnterpriseServer /// public event GetDistributionListPermissionsCompletedEventHandler GetDistributionListPermissionsCompleted; + /// + public event GetMobileDevicesCompletedEventHandler GetMobileDevicesCompleted; + + /// + public event GetMobileDeviceCompletedEventHandler GetMobileDeviceCompleted; + + /// + public event WipeDataFromDeviceCompletedEventHandler WipeDataFromDeviceCompleted; + + /// + public event CancelRemoteWipeRequestCompletedEventHandler CancelRemoteWipeRequestCompleted; + + /// + public event RemoveDeviceCompletedEventHandler RemoveDeviceCompleted; + + /// + public event GetExchangeMailboxPlansCompletedEventHandler GetExchangeMailboxPlansCompleted; + + /// + public event GetExchangeMailboxPlanCompletedEventHandler GetExchangeMailboxPlanCompleted; + + /// + public event AddExchangeMailboxPlanCompletedEventHandler AddExchangeMailboxPlanCompleted; + + /// + public event DeleteExchangeMailboxPlanCompletedEventHandler DeleteExchangeMailboxPlanCompleted; + + /// + public event SetOrganizationDefaultExchangeMailboxPlanCompletedEventHandler SetOrganizationDefaultExchangeMailboxPlanCompleted; + /// public event CreatePublicFolderCompletedEventHandler CreatePublicFolderCompleted; @@ -444,500 +420,22 @@ namespace WebsitePanel.EnterpriseServer public event SetPublicFolderGeneralSettingsCompletedEventHandler SetPublicFolderGeneralSettingsCompleted; /// - [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://smbsaas/websitepanel/enterpriseserver/GetPublicFolderMailFlowSettings", RequestNamespace="http://smbsaas/websitepanel/enterpriseserver", ResponseNamespace="http://smbsaas/websitepanel/enterpriseserver", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] - public ExchangePublicFolder GetPublicFolderMailFlowSettings(int itemId, int accountId) { - object[] results = this.Invoke("GetPublicFolderMailFlowSettings", new object[] { - itemId, - accountId}); - return ((ExchangePublicFolder)(results[0])); - } + public event GetPublicFolderMailFlowSettingsCompletedEventHandler GetPublicFolderMailFlowSettingsCompleted; /// - public System.IAsyncResult BeginGetPublicFolderMailFlowSettings(int itemId, int accountId, System.AsyncCallback callback, object asyncState) { - return this.BeginInvoke("GetPublicFolderMailFlowSettings", new object[] { - itemId, - accountId}, callback, asyncState); - } + public event SetPublicFolderMailFlowSettingsCompletedEventHandler SetPublicFolderMailFlowSettingsCompleted; /// - public ExchangePublicFolder EndGetPublicFolderMailFlowSettings(System.IAsyncResult asyncResult) { - object[] results = this.EndInvoke(asyncResult); - return ((ExchangePublicFolder)(results[0])); - } + public event GetPublicFolderEmailAddressesCompletedEventHandler GetPublicFolderEmailAddressesCompleted; /// - public void GetPublicFolderMailFlowSettingsAsync(int itemId, int accountId) { - this.GetPublicFolderMailFlowSettingsAsync(itemId, accountId, null); - } + public event AddPublicFolderEmailAddressCompletedEventHandler AddPublicFolderEmailAddressCompleted; /// - public void GetPublicFolderMailFlowSettingsAsync(int itemId, int accountId, object userState) { - if ((this.GetPublicFolderMailFlowSettingsOperationCompleted == null)) { - this.GetPublicFolderMailFlowSettingsOperationCompleted = new System.Threading.SendOrPostCallback(this.OnGetPublicFolderMailFlowSettingsOperationCompleted); - } - this.InvokeAsync("GetPublicFolderMailFlowSettings", new object[] { - itemId, - accountId}, this.GetPublicFolderMailFlowSettingsOperationCompleted, userState); - } - - private void OnGetPublicFolderMailFlowSettingsOperationCompleted(object arg) { - if ((this.GetPublicFolderMailFlowSettingsCompleted != null)) { - System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); - this.GetPublicFolderMailFlowSettingsCompleted(this, new GetPublicFolderMailFlowSettingsCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); - } - } + public event SetPublicFolderPrimaryEmailAddressCompletedEventHandler SetPublicFolderPrimaryEmailAddressCompleted; /// - [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://smbsaas/websitepanel/enterpriseserver/SetPublicFolderMailFlowSettings", RequestNamespace="http://smbsaas/websitepanel/enterpriseserver", ResponseNamespace="http://smbsaas/websitepanel/enterpriseserver", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] - public int SetPublicFolderMailFlowSettings(int itemId, int accountId, string[] acceptAccounts, string[] rejectAccounts, bool requireSenderAuthentication) { - object[] results = this.Invoke("SetPublicFolderMailFlowSettings", new object[] { - itemId, - accountId, - acceptAccounts, - rejectAccounts, - requireSenderAuthentication}); - return ((int)(results[0])); - } - - /// - public System.IAsyncResult BeginSetPublicFolderMailFlowSettings(int itemId, int accountId, string[] acceptAccounts, string[] rejectAccounts, bool requireSenderAuthentication, System.AsyncCallback callback, object asyncState) { - return this.BeginInvoke("SetPublicFolderMailFlowSettings", new object[] { - itemId, - accountId, - acceptAccounts, - rejectAccounts, - requireSenderAuthentication}, callback, asyncState); - } - - /// - public int EndSetPublicFolderMailFlowSettings(System.IAsyncResult asyncResult) { - object[] results = this.EndInvoke(asyncResult); - return ((int)(results[0])); - } - - /// - public void SetPublicFolderMailFlowSettingsAsync(int itemId, int accountId, string[] acceptAccounts, string[] rejectAccounts, bool requireSenderAuthentication) { - this.SetPublicFolderMailFlowSettingsAsync(itemId, accountId, acceptAccounts, rejectAccounts, requireSenderAuthentication, null); - } - - /// - public void SetPublicFolderMailFlowSettingsAsync(int itemId, int accountId, string[] acceptAccounts, string[] rejectAccounts, bool requireSenderAuthentication, object userState) { - if ((this.SetPublicFolderMailFlowSettingsOperationCompleted == null)) { - this.SetPublicFolderMailFlowSettingsOperationCompleted = new System.Threading.SendOrPostCallback(this.OnSetPublicFolderMailFlowSettingsOperationCompleted); - } - this.InvokeAsync("SetPublicFolderMailFlowSettings", new object[] { - itemId, - accountId, - acceptAccounts, - rejectAccounts, - requireSenderAuthentication}, this.SetPublicFolderMailFlowSettingsOperationCompleted, userState); - } - - private void OnSetPublicFolderMailFlowSettingsOperationCompleted(object arg) { - if ((this.SetPublicFolderMailFlowSettingsCompleted != null)) { - System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); - this.SetPublicFolderMailFlowSettingsCompleted(this, new SetPublicFolderMailFlowSettingsCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); - } - } - - /// - [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://smbsaas/websitepanel/enterpriseserver/GetPublicFolderEmailAddresses", RequestNamespace="http://smbsaas/websitepanel/enterpriseserver", ResponseNamespace="http://smbsaas/websitepanel/enterpriseserver", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] - public ExchangeEmailAddress[] GetPublicFolderEmailAddresses(int itemId, int accountId) { - object[] results = this.Invoke("GetPublicFolderEmailAddresses", new object[] { - itemId, - accountId}); - return ((ExchangeEmailAddress[])(results[0])); - } - - /// - public System.IAsyncResult BeginGetPublicFolderEmailAddresses(int itemId, int accountId, System.AsyncCallback callback, object asyncState) { - return this.BeginInvoke("GetPublicFolderEmailAddresses", new object[] { - itemId, - accountId}, callback, asyncState); - } - - /// - public ExchangeEmailAddress[] EndGetPublicFolderEmailAddresses(System.IAsyncResult asyncResult) { - object[] results = this.EndInvoke(asyncResult); - return ((ExchangeEmailAddress[])(results[0])); - } - - /// - public void GetPublicFolderEmailAddressesAsync(int itemId, int accountId) { - this.GetPublicFolderEmailAddressesAsync(itemId, accountId, null); - } - - /// - public void GetPublicFolderEmailAddressesAsync(int itemId, int accountId, object userState) { - if ((this.GetPublicFolderEmailAddressesOperationCompleted == null)) { - this.GetPublicFolderEmailAddressesOperationCompleted = new System.Threading.SendOrPostCallback(this.OnGetPublicFolderEmailAddressesOperationCompleted); - } - this.InvokeAsync("GetPublicFolderEmailAddresses", new object[] { - itemId, - accountId}, this.GetPublicFolderEmailAddressesOperationCompleted, userState); - } - - private void OnGetPublicFolderEmailAddressesOperationCompleted(object arg) { - if ((this.GetPublicFolderEmailAddressesCompleted != null)) { - System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); - this.GetPublicFolderEmailAddressesCompleted(this, new GetPublicFolderEmailAddressesCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); - } - } - - /// - [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://smbsaas/websitepanel/enterpriseserver/AddPublicFolderEmailAddress", RequestNamespace="http://smbsaas/websitepanel/enterpriseserver", ResponseNamespace="http://smbsaas/websitepanel/enterpriseserver", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] - public int AddPublicFolderEmailAddress(int itemId, int accountId, string emailAddress) { - object[] results = this.Invoke("AddPublicFolderEmailAddress", new object[] { - itemId, - accountId, - emailAddress}); - return ((int)(results[0])); - } - - /// - public System.IAsyncResult BeginAddPublicFolderEmailAddress(int itemId, int accountId, string emailAddress, System.AsyncCallback callback, object asyncState) { - return this.BeginInvoke("AddPublicFolderEmailAddress", new object[] { - itemId, - accountId, - emailAddress}, callback, asyncState); - } - - /// - public int EndAddPublicFolderEmailAddress(System.IAsyncResult asyncResult) { - object[] results = this.EndInvoke(asyncResult); - return ((int)(results[0])); - } - - /// - public void AddPublicFolderEmailAddressAsync(int itemId, int accountId, string emailAddress) { - this.AddPublicFolderEmailAddressAsync(itemId, accountId, emailAddress, null); - } - - /// - public void AddPublicFolderEmailAddressAsync(int itemId, int accountId, string emailAddress, object userState) { - if ((this.AddPublicFolderEmailAddressOperationCompleted == null)) { - this.AddPublicFolderEmailAddressOperationCompleted = new System.Threading.SendOrPostCallback(this.OnAddPublicFolderEmailAddressOperationCompleted); - } - this.InvokeAsync("AddPublicFolderEmailAddress", new object[] { - itemId, - accountId, - emailAddress}, this.AddPublicFolderEmailAddressOperationCompleted, userState); - } - - private void OnAddPublicFolderEmailAddressOperationCompleted(object arg) { - if ((this.AddPublicFolderEmailAddressCompleted != null)) { - System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); - this.AddPublicFolderEmailAddressCompleted(this, new AddPublicFolderEmailAddressCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); - } - } - - /// - [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://smbsaas/websitepanel/enterpriseserver/SetPublicFolderPrimaryEmailAddress", RequestNamespace="http://smbsaas/websitepanel/enterpriseserver", ResponseNamespace="http://smbsaas/websitepanel/enterpriseserver", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] - public int SetPublicFolderPrimaryEmailAddress(int itemId, int accountId, string emailAddress) { - object[] results = this.Invoke("SetPublicFolderPrimaryEmailAddress", new object[] { - itemId, - accountId, - emailAddress}); - return ((int)(results[0])); - } - - /// - public System.IAsyncResult BeginSetPublicFolderPrimaryEmailAddress(int itemId, int accountId, string emailAddress, System.AsyncCallback callback, object asyncState) { - return this.BeginInvoke("SetPublicFolderPrimaryEmailAddress", new object[] { - itemId, - accountId, - emailAddress}, callback, asyncState); - } - - /// - public int EndSetPublicFolderPrimaryEmailAddress(System.IAsyncResult asyncResult) { - object[] results = this.EndInvoke(asyncResult); - return ((int)(results[0])); - } - - /// - public void SetPublicFolderPrimaryEmailAddressAsync(int itemId, int accountId, string emailAddress) { - this.SetPublicFolderPrimaryEmailAddressAsync(itemId, accountId, emailAddress, null); - } - - /// - public void SetPublicFolderPrimaryEmailAddressAsync(int itemId, int accountId, string emailAddress, object userState) { - if ((this.SetPublicFolderPrimaryEmailAddressOperationCompleted == null)) { - this.SetPublicFolderPrimaryEmailAddressOperationCompleted = new System.Threading.SendOrPostCallback(this.OnSetPublicFolderPrimaryEmailAddressOperationCompleted); - } - this.InvokeAsync("SetPublicFolderPrimaryEmailAddress", new object[] { - itemId, - accountId, - emailAddress}, this.SetPublicFolderPrimaryEmailAddressOperationCompleted, userState); - } - - private void OnSetPublicFolderPrimaryEmailAddressOperationCompleted(object arg) { - if ((this.SetPublicFolderPrimaryEmailAddressCompleted != null)) { - System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); - this.SetPublicFolderPrimaryEmailAddressCompleted(this, new SetPublicFolderPrimaryEmailAddressCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); - } - } - - /// - [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://smbsaas/websitepanel/enterpriseserver/DeletePublicFolderEmailAddresses", RequestNamespace="http://smbsaas/websitepanel/enterpriseserver", ResponseNamespace="http://smbsaas/websitepanel/enterpriseserver", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] - public int DeletePublicFolderEmailAddresses(int itemId, int accountId, string[] emailAddresses) { - object[] results = this.Invoke("DeletePublicFolderEmailAddresses", new object[] { - itemId, - accountId, - emailAddresses}); - return ((int)(results[0])); - } - - /// - public System.IAsyncResult BeginDeletePublicFolderEmailAddresses(int itemId, int accountId, string[] emailAddresses, System.AsyncCallback callback, object asyncState) { - return this.BeginInvoke("DeletePublicFolderEmailAddresses", new object[] { - itemId, - accountId, - emailAddresses}, callback, asyncState); - } - - /// - public int EndDeletePublicFolderEmailAddresses(System.IAsyncResult asyncResult) { - object[] results = this.EndInvoke(asyncResult); - return ((int)(results[0])); - } - - /// - public void DeletePublicFolderEmailAddressesAsync(int itemId, int accountId, string[] emailAddresses) { - this.DeletePublicFolderEmailAddressesAsync(itemId, accountId, emailAddresses, null); - } - - /// - public void DeletePublicFolderEmailAddressesAsync(int itemId, int accountId, string[] emailAddresses, object userState) { - if ((this.DeletePublicFolderEmailAddressesOperationCompleted == null)) { - this.DeletePublicFolderEmailAddressesOperationCompleted = new System.Threading.SendOrPostCallback(this.OnDeletePublicFolderEmailAddressesOperationCompleted); - } - this.InvokeAsync("DeletePublicFolderEmailAddresses", new object[] { - itemId, - accountId, - emailAddresses}, this.DeletePublicFolderEmailAddressesOperationCompleted, userState); - } - - private void OnDeletePublicFolderEmailAddressesOperationCompleted(object arg) { - if ((this.DeletePublicFolderEmailAddressesCompleted != null)) { - System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); - this.DeletePublicFolderEmailAddressesCompleted(this, new DeletePublicFolderEmailAddressesCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); - } - } - - /// - [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://smbsaas/websitepanel/enterpriseserver/GetMobileDevices", RequestNamespace="http://smbsaas/websitepanel/enterpriseserver", ResponseNamespace="http://smbsaas/websitepanel/enterpriseserver", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] - public ExchangeMobileDevice[] GetMobileDevices(int itemId, int accountId) { - object[] results = this.Invoke("GetMobileDevices", new object[] { - itemId, - accountId}); - return ((ExchangeMobileDevice[])(results[0])); - } - - /// - public System.IAsyncResult BeginGetMobileDevices(int itemId, int accountId, System.AsyncCallback callback, object asyncState) { - return this.BeginInvoke("GetMobileDevices", new object[] { - itemId, - accountId}, callback, asyncState); - } - - /// - public ExchangeMobileDevice[] EndGetMobileDevices(System.IAsyncResult asyncResult) { - object[] results = this.EndInvoke(asyncResult); - return ((ExchangeMobileDevice[])(results[0])); - } - - /// - public void GetMobileDevicesAsync(int itemId, int accountId) { - this.GetMobileDevicesAsync(itemId, accountId, null); - } - - /// - public void GetMobileDevicesAsync(int itemId, int accountId, object userState) { - if ((this.GetMobileDevicesOperationCompleted == null)) { - this.GetMobileDevicesOperationCompleted = new System.Threading.SendOrPostCallback(this.OnGetMobileDevicesOperationCompleted); - } - this.InvokeAsync("GetMobileDevices", new object[] { - itemId, - accountId}, this.GetMobileDevicesOperationCompleted, userState); - } - - private void OnGetMobileDevicesOperationCompleted(object arg) { - if ((this.GetMobileDevicesCompleted != null)) { - System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); - this.GetMobileDevicesCompleted(this, new GetMobileDevicesCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); - } - } - - /// - [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://smbsaas/websitepanel/enterpriseserver/GetMobileDevice", RequestNamespace="http://smbsaas/websitepanel/enterpriseserver", ResponseNamespace="http://smbsaas/websitepanel/enterpriseserver", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] - public ExchangeMobileDevice GetMobileDevice(int itemId, string deviceId) { - object[] results = this.Invoke("GetMobileDevice", new object[] { - itemId, - deviceId}); - return ((ExchangeMobileDevice)(results[0])); - } - - /// - public System.IAsyncResult BeginGetMobileDevice(int itemId, string deviceId, System.AsyncCallback callback, object asyncState) { - return this.BeginInvoke("GetMobileDevice", new object[] { - itemId, - deviceId}, callback, asyncState); - } - - /// - public ExchangeMobileDevice EndGetMobileDevice(System.IAsyncResult asyncResult) { - object[] results = this.EndInvoke(asyncResult); - return ((ExchangeMobileDevice)(results[0])); - } - - /// - public void GetMobileDeviceAsync(int itemId, string deviceId) { - this.GetMobileDeviceAsync(itemId, deviceId, null); - } - - /// - public void GetMobileDeviceAsync(int itemId, string deviceId, object userState) { - if ((this.GetMobileDeviceOperationCompleted == null)) { - this.GetMobileDeviceOperationCompleted = new System.Threading.SendOrPostCallback(this.OnGetMobileDeviceOperationCompleted); - } - this.InvokeAsync("GetMobileDevice", new object[] { - itemId, - deviceId}, this.GetMobileDeviceOperationCompleted, userState); - } - - private void OnGetMobileDeviceOperationCompleted(object arg) { - if ((this.GetMobileDeviceCompleted != null)) { - System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); - this.GetMobileDeviceCompleted(this, new GetMobileDeviceCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); - } - } - - /// - [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://smbsaas/websitepanel/enterpriseserver/WipeDataFromDevice", RequestNamespace="http://smbsaas/websitepanel/enterpriseserver", ResponseNamespace="http://smbsaas/websitepanel/enterpriseserver", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] - public void WipeDataFromDevice(int itemId, string deviceId) { - this.Invoke("WipeDataFromDevice", new object[] { - itemId, - deviceId}); - } - - /// - public System.IAsyncResult BeginWipeDataFromDevice(int itemId, string deviceId, System.AsyncCallback callback, object asyncState) { - return this.BeginInvoke("WipeDataFromDevice", new object[] { - itemId, - deviceId}, callback, asyncState); - } - - /// - public void EndWipeDataFromDevice(System.IAsyncResult asyncResult) { - this.EndInvoke(asyncResult); - } - - /// - public void WipeDataFromDeviceAsync(int itemId, string deviceId) { - this.WipeDataFromDeviceAsync(itemId, deviceId, null); - } - - /// - public void WipeDataFromDeviceAsync(int itemId, string deviceId, object userState) { - if ((this.WipeDataFromDeviceOperationCompleted == null)) { - this.WipeDataFromDeviceOperationCompleted = new System.Threading.SendOrPostCallback(this.OnWipeDataFromDeviceOperationCompleted); - } - this.InvokeAsync("WipeDataFromDevice", new object[] { - itemId, - deviceId}, this.WipeDataFromDeviceOperationCompleted, userState); - } - - private void OnWipeDataFromDeviceOperationCompleted(object arg) { - if ((this.WipeDataFromDeviceCompleted != null)) { - System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); - this.WipeDataFromDeviceCompleted(this, new System.ComponentModel.AsyncCompletedEventArgs(invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); - } - } - - /// - [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://smbsaas/websitepanel/enterpriseserver/CancelRemoteWipeRequest", RequestNamespace="http://smbsaas/websitepanel/enterpriseserver", ResponseNamespace="http://smbsaas/websitepanel/enterpriseserver", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] - public void CancelRemoteWipeRequest(int itemId, string deviceId) { - this.Invoke("CancelRemoteWipeRequest", new object[] { - itemId, - deviceId}); - } - - /// - public System.IAsyncResult BeginCancelRemoteWipeRequest(int itemId, string deviceId, System.AsyncCallback callback, object asyncState) { - return this.BeginInvoke("CancelRemoteWipeRequest", new object[] { - itemId, - deviceId}, callback, asyncState); - } - - /// - public void EndCancelRemoteWipeRequest(System.IAsyncResult asyncResult) { - this.EndInvoke(asyncResult); - } - - /// - public void CancelRemoteWipeRequestAsync(int itemId, string deviceId) { - this.CancelRemoteWipeRequestAsync(itemId, deviceId, null); - } - - /// - public void CancelRemoteWipeRequestAsync(int itemId, string deviceId, object userState) { - if ((this.CancelRemoteWipeRequestOperationCompleted == null)) { - this.CancelRemoteWipeRequestOperationCompleted = new System.Threading.SendOrPostCallback(this.OnCancelRemoteWipeRequestOperationCompleted); - } - this.InvokeAsync("CancelRemoteWipeRequest", new object[] { - itemId, - deviceId}, this.CancelRemoteWipeRequestOperationCompleted, userState); - } - - private void OnCancelRemoteWipeRequestOperationCompleted(object arg) { - if ((this.CancelRemoteWipeRequestCompleted != null)) { - System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); - this.CancelRemoteWipeRequestCompleted(this, new System.ComponentModel.AsyncCompletedEventArgs(invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); - } - } - - /// - [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://smbsaas/websitepanel/enterpriseserver/RemoveDevice", RequestNamespace="http://smbsaas/websitepanel/enterpriseserver", ResponseNamespace="http://smbsaas/websitepanel/enterpriseserver", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] - public void RemoveDevice(int itemId, string deviceId) { - this.Invoke("RemoveDevice", new object[] { - itemId, - deviceId}); - } - - /// - public System.IAsyncResult BeginRemoveDevice(int itemId, string deviceId, System.AsyncCallback callback, object asyncState) { - return this.BeginInvoke("RemoveDevice", new object[] { - itemId, - deviceId}, callback, asyncState); - } - - /// - public void EndRemoveDevice(System.IAsyncResult asyncResult) { - this.EndInvoke(asyncResult); - } - - /// - public void RemoveDeviceAsync(int itemId, string deviceId) { - this.RemoveDeviceAsync(itemId, deviceId, null); - } - - /// - public void RemoveDeviceAsync(int itemId, string deviceId, object userState) { - if ((this.RemoveDeviceOperationCompleted == null)) { - this.RemoveDeviceOperationCompleted = new System.Threading.SendOrPostCallback(this.OnRemoveDeviceOperationCompleted); - } - this.InvokeAsync("RemoveDevice", new object[] { - itemId, - deviceId}, this.RemoveDeviceOperationCompleted, userState); - } - - private void OnRemoveDeviceOperationCompleted(object arg) { - if ((this.RemoveDeviceCompleted != null)) { - System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); - this.RemoveDeviceCompleted(this, new System.ComponentModel.AsyncCompletedEventArgs(invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); - } - } + public event DeletePublicFolderEmailAddressesCompletedEventHandler DeletePublicFolderEmailAddressesCompleted; /// [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://smbsaas/websitepanel/enterpriseserver/GetRawExchangeOrganizationsPaged", RequestNamespace="http://smbsaas/websitepanel/enterpriseserver", ResponseNamespace="http://smbsaas/websitepanel/enterpriseserver", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] @@ -1363,43 +861,46 @@ namespace WebsitePanel.EnterpriseServer } /// - [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://smbsaas/websitepanel/enterpriseserver/GetPublicFoldersStatistics", RequestNamespace="http://smbsaas/websitepanel/enterpriseserver", ResponseNamespace="http://smbsaas/websitepanel/enterpriseserver", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] - public ExchangeItemStatistics[] GetPublicFoldersStatistics(int itemId) { - object[] results = this.Invoke("GetPublicFoldersStatistics", new object[] { - itemId}); - return ((ExchangeItemStatistics[])(results[0])); + [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://smbsaas/websitepanel/enterpriseserver/GetMailboxStatistics", RequestNamespace="http://smbsaas/websitepanel/enterpriseserver", ResponseNamespace="http://smbsaas/websitepanel/enterpriseserver", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] + public ExchangeMailboxStatistics GetMailboxStatistics(int itemId, int accountId) { + object[] results = this.Invoke("GetMailboxStatistics", new object[] { + itemId, + accountId}); + return ((ExchangeMailboxStatistics)(results[0])); } /// - public System.IAsyncResult BeginGetPublicFoldersStatistics(int itemId, System.AsyncCallback callback, object asyncState) { - return this.BeginInvoke("GetPublicFoldersStatistics", new object[] { - itemId}, callback, asyncState); + public System.IAsyncResult BeginGetMailboxStatistics(int itemId, int accountId, System.AsyncCallback callback, object asyncState) { + return this.BeginInvoke("GetMailboxStatistics", new object[] { + itemId, + accountId}, callback, asyncState); } /// - public ExchangeItemStatistics[] EndGetPublicFoldersStatistics(System.IAsyncResult asyncResult) { + public ExchangeMailboxStatistics EndGetMailboxStatistics(System.IAsyncResult asyncResult) { object[] results = this.EndInvoke(asyncResult); - return ((ExchangeItemStatistics[])(results[0])); + return ((ExchangeMailboxStatistics)(results[0])); } /// - public void GetPublicFoldersStatisticsAsync(int itemId) { - this.GetPublicFoldersStatisticsAsync(itemId, null); + public void GetMailboxStatisticsAsync(int itemId, int accountId) { + this.GetMailboxStatisticsAsync(itemId, accountId, null); } /// - public void GetPublicFoldersStatisticsAsync(int itemId, object userState) { - if ((this.GetPublicFoldersStatisticsOperationCompleted == null)) { - this.GetPublicFoldersStatisticsOperationCompleted = new System.Threading.SendOrPostCallback(this.OnGetPublicFoldersStatisticsOperationCompleted); + public void GetMailboxStatisticsAsync(int itemId, int accountId, object userState) { + if ((this.GetMailboxStatisticsOperationCompleted == null)) { + this.GetMailboxStatisticsOperationCompleted = new System.Threading.SendOrPostCallback(this.OnGetMailboxStatisticsOperationCompleted); } - this.InvokeAsync("GetPublicFoldersStatistics", new object[] { - itemId}, this.GetPublicFoldersStatisticsOperationCompleted, userState); + this.InvokeAsync("GetMailboxStatistics", new object[] { + itemId, + accountId}, this.GetMailboxStatisticsOperationCompleted, userState); } - private void OnGetPublicFoldersStatisticsOperationCompleted(object arg) { - if ((this.GetPublicFoldersStatisticsCompleted != null)) { + private void OnGetMailboxStatisticsOperationCompleted(object arg) { + if ((this.GetMailboxStatisticsCompleted != null)) { System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); - this.GetPublicFoldersStatisticsCompleted(this, new GetPublicFoldersStatisticsCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); + this.GetMailboxStatisticsCompleted(this, new GetMailboxStatisticsCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); } } @@ -2038,7 +1539,7 @@ namespace WebsitePanel.EnterpriseServer /// [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://smbsaas/websitepanel/enterpriseserver/CreateMailbox", RequestNamespace="http://smbsaas/websitepanel/enterpriseserver", ResponseNamespace="http://smbsaas/websitepanel/enterpriseserver", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] - public int CreateMailbox(int itemId, int accountId, ExchangeAccountType accountType, string accountName, string displayName, string name, string domain, string password, bool sendSetupInstructions, string setupInstructionMailAddress) { + public int CreateMailbox(int itemId, int accountId, ExchangeAccountType accountType, string accountName, string displayName, string name, string domain, string password, bool sendSetupInstructions, string setupInstructionMailAddress, int mailboxPlanId, string subscriberNumber) { object[] results = this.Invoke("CreateMailbox", new object[] { itemId, accountId, @@ -2049,12 +1550,14 @@ namespace WebsitePanel.EnterpriseServer domain, password, sendSetupInstructions, - setupInstructionMailAddress}); + setupInstructionMailAddress, + mailboxPlanId, + subscriberNumber}); return ((int)(results[0])); } /// - public System.IAsyncResult BeginCreateMailbox(int itemId, int accountId, ExchangeAccountType accountType, string accountName, string displayName, string name, string domain, string password, bool sendSetupInstructions, string setupInstructionMailAddress, System.AsyncCallback callback, object asyncState) { + public System.IAsyncResult BeginCreateMailbox(int itemId, int accountId, ExchangeAccountType accountType, string accountName, string displayName, string name, string domain, string password, bool sendSetupInstructions, string setupInstructionMailAddress, int mailboxPlanId, string subscriberNumber, System.AsyncCallback callback, object asyncState) { return this.BeginInvoke("CreateMailbox", new object[] { itemId, accountId, @@ -2065,7 +1568,9 @@ namespace WebsitePanel.EnterpriseServer domain, password, sendSetupInstructions, - setupInstructionMailAddress}, callback, asyncState); + setupInstructionMailAddress, + mailboxPlanId, + subscriberNumber}, callback, asyncState); } /// @@ -2075,12 +1580,12 @@ namespace WebsitePanel.EnterpriseServer } /// - public void CreateMailboxAsync(int itemId, int accountId, ExchangeAccountType accountType, string accountName, string displayName, string name, string domain, string password, bool sendSetupInstructions, string setupInstructionMailAddress) { - this.CreateMailboxAsync(itemId, accountId, accountType, accountName, displayName, name, domain, password, sendSetupInstructions, setupInstructionMailAddress, null); + public void CreateMailboxAsync(int itemId, int accountId, ExchangeAccountType accountType, string accountName, string displayName, string name, string domain, string password, bool sendSetupInstructions, string setupInstructionMailAddress, int mailboxPlanId, string subscriberNumber) { + this.CreateMailboxAsync(itemId, accountId, accountType, accountName, displayName, name, domain, password, sendSetupInstructions, setupInstructionMailAddress, mailboxPlanId, subscriberNumber, null); } /// - public void CreateMailboxAsync(int itemId, int accountId, ExchangeAccountType accountType, string accountName, string displayName, string name, string domain, string password, bool sendSetupInstructions, string setupInstructionMailAddress, object userState) { + public void CreateMailboxAsync(int itemId, int accountId, ExchangeAccountType accountType, string accountName, string displayName, string name, string domain, string password, bool sendSetupInstructions, string setupInstructionMailAddress, int mailboxPlanId, string subscriberNumber, object userState) { if ((this.CreateMailboxOperationCompleted == null)) { this.CreateMailboxOperationCompleted = new System.Threading.SendOrPostCallback(this.OnCreateMailboxOperationCompleted); } @@ -2094,7 +1599,9 @@ namespace WebsitePanel.EnterpriseServer domain, password, sendSetupInstructions, - setupInstructionMailAddress}, this.CreateMailboxOperationCompleted, userState); + setupInstructionMailAddress, + mailboxPlanId, + subscriberNumber}, this.CreateMailboxOperationCompleted, userState); } private void OnCreateMailboxOperationCompleted(object arg) { @@ -2238,120 +1745,22 @@ namespace WebsitePanel.EnterpriseServer /// [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://smbsaas/websitepanel/enterpriseserver/SetMailboxGeneralSettings", RequestNamespace="http://smbsaas/websitepanel/enterpriseserver", ResponseNamespace="http://smbsaas/websitepanel/enterpriseserver", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] - public int SetMailboxGeneralSettings( - int itemId, - int accountId, - string displayName, - string password, - bool hideAddressBook, - bool disabled, - string firstName, - string initials, - string lastName, - string address, - string city, - string state, - string zip, - string country, - string jobTitle, - string company, - string department, - string office, - string managerAccountName, - string businessPhone, - string fax, - string homePhone, - string mobilePhone, - string pager, - string webPage, - string notes) { + public int SetMailboxGeneralSettings(int itemId, int accountId, bool hideAddressBook, bool disabled) { object[] results = this.Invoke("SetMailboxGeneralSettings", new object[] { itemId, accountId, - displayName, - password, hideAddressBook, - disabled, - firstName, - initials, - lastName, - address, - city, - state, - zip, - country, - jobTitle, - company, - department, - office, - managerAccountName, - businessPhone, - fax, - homePhone, - mobilePhone, - pager, - webPage, - notes}); + disabled}); return ((int)(results[0])); } /// - public System.IAsyncResult BeginSetMailboxGeneralSettings( - int itemId, - int accountId, - string displayName, - string password, - bool hideAddressBook, - bool disabled, - string firstName, - string initials, - string lastName, - string address, - string city, - string state, - string zip, - string country, - string jobTitle, - string company, - string department, - string office, - string managerAccountName, - string businessPhone, - string fax, - string homePhone, - string mobilePhone, - string pager, - string webPage, - string notes, - System.AsyncCallback callback, - object asyncState) { + public System.IAsyncResult BeginSetMailboxGeneralSettings(int itemId, int accountId, bool hideAddressBook, bool disabled, System.AsyncCallback callback, object asyncState) { return this.BeginInvoke("SetMailboxGeneralSettings", new object[] { itemId, accountId, - displayName, - password, hideAddressBook, - disabled, - firstName, - initials, - lastName, - address, - city, - state, - zip, - country, - jobTitle, - company, - department, - office, - managerAccountName, - businessPhone, - fax, - homePhone, - mobilePhone, - pager, - webPage, - notes}, callback, asyncState); + disabled}, callback, asyncState); } /// @@ -2361,95 +1770,20 @@ namespace WebsitePanel.EnterpriseServer } /// - public void SetMailboxGeneralSettingsAsync( - int itemId, - int accountId, - string displayName, - string password, - bool hideAddressBook, - bool disabled, - string firstName, - string initials, - string lastName, - string address, - string city, - string state, - string zip, - string country, - string jobTitle, - string company, - string department, - string office, - string managerAccountName, - string businessPhone, - string fax, - string homePhone, - string mobilePhone, - string pager, - string webPage, - string notes) { - this.SetMailboxGeneralSettingsAsync(itemId, accountId, displayName, password, hideAddressBook, disabled, firstName, initials, lastName, address, city, state, zip, country, jobTitle, company, department, office, managerAccountName, businessPhone, fax, homePhone, mobilePhone, pager, webPage, notes, null); + public void SetMailboxGeneralSettingsAsync(int itemId, int accountId, bool hideAddressBook, bool disabled) { + this.SetMailboxGeneralSettingsAsync(itemId, accountId, hideAddressBook, disabled, null); } /// - public void SetMailboxGeneralSettingsAsync( - int itemId, - int accountId, - string displayName, - string password, - bool hideAddressBook, - bool disabled, - string firstName, - string initials, - string lastName, - string address, - string city, - string state, - string zip, - string country, - string jobTitle, - string company, - string department, - string office, - string managerAccountName, - string businessPhone, - string fax, - string homePhone, - string mobilePhone, - string pager, - string webPage, - string notes, - object userState) { + public void SetMailboxGeneralSettingsAsync(int itemId, int accountId, bool hideAddressBook, bool disabled, object userState) { if ((this.SetMailboxGeneralSettingsOperationCompleted == null)) { this.SetMailboxGeneralSettingsOperationCompleted = new System.Threading.SendOrPostCallback(this.OnSetMailboxGeneralSettingsOperationCompleted); } this.InvokeAsync("SetMailboxGeneralSettings", new object[] { itemId, accountId, - displayName, - password, hideAddressBook, - disabled, - firstName, - initials, - lastName, - address, - city, - state, - zip, - country, - jobTitle, - company, - department, - office, - managerAccountName, - businessPhone, - fax, - homePhone, - mobilePhone, - pager, - webPage, - notes}, this.SetMailboxGeneralSettingsOperationCompleted, userState); + disabled}, this.SetMailboxGeneralSettingsOperationCompleted, userState); } private void OnSetMailboxGeneralSettingsOperationCompleted(object arg) { @@ -2690,7 +2024,7 @@ namespace WebsitePanel.EnterpriseServer /// [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://smbsaas/websitepanel/enterpriseserver/SetMailboxMailFlowSettings", RequestNamespace="http://smbsaas/websitepanel/enterpriseserver", ResponseNamespace="http://smbsaas/websitepanel/enterpriseserver", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] - public int SetMailboxMailFlowSettings(int itemId, int accountId, bool enableForwarding, string forwardingAccountName, bool forwardToBoth, string[] sendOnBehalfAccounts, string[] acceptAccounts, string[] rejectAccounts, int maxRecipients, int maxSendMessageSizeKB, int maxReceiveMessageSizeKB, bool requireSenderAuthentication) { + public int SetMailboxMailFlowSettings(int itemId, int accountId, bool enableForwarding, string forwardingAccountName, bool forwardToBoth, string[] sendOnBehalfAccounts, string[] acceptAccounts, string[] rejectAccounts, bool requireSenderAuthentication) { object[] results = this.Invoke("SetMailboxMailFlowSettings", new object[] { itemId, accountId, @@ -2700,15 +2034,12 @@ namespace WebsitePanel.EnterpriseServer sendOnBehalfAccounts, acceptAccounts, rejectAccounts, - maxRecipients, - maxSendMessageSizeKB, - maxReceiveMessageSizeKB, requireSenderAuthentication}); return ((int)(results[0])); } /// - public System.IAsyncResult BeginSetMailboxMailFlowSettings(int itemId, int accountId, bool enableForwarding, string forwardingAccountName, bool forwardToBoth, string[] sendOnBehalfAccounts, string[] acceptAccounts, string[] rejectAccounts, int maxRecipients, int maxSendMessageSizeKB, int maxReceiveMessageSizeKB, bool requireSenderAuthentication, System.AsyncCallback callback, object asyncState) { + public System.IAsyncResult BeginSetMailboxMailFlowSettings(int itemId, int accountId, bool enableForwarding, string forwardingAccountName, bool forwardToBoth, string[] sendOnBehalfAccounts, string[] acceptAccounts, string[] rejectAccounts, bool requireSenderAuthentication, System.AsyncCallback callback, object asyncState) { return this.BeginInvoke("SetMailboxMailFlowSettings", new object[] { itemId, accountId, @@ -2718,9 +2049,6 @@ namespace WebsitePanel.EnterpriseServer sendOnBehalfAccounts, acceptAccounts, rejectAccounts, - maxRecipients, - maxSendMessageSizeKB, - maxReceiveMessageSizeKB, requireSenderAuthentication}, callback, asyncState); } @@ -2731,12 +2059,12 @@ namespace WebsitePanel.EnterpriseServer } /// - public void SetMailboxMailFlowSettingsAsync(int itemId, int accountId, bool enableForwarding, string forwardingAccountName, bool forwardToBoth, string[] sendOnBehalfAccounts, string[] acceptAccounts, string[] rejectAccounts, int maxRecipients, int maxSendMessageSizeKB, int maxReceiveMessageSizeKB, bool requireSenderAuthentication) { - this.SetMailboxMailFlowSettingsAsync(itemId, accountId, enableForwarding, forwardingAccountName, forwardToBoth, sendOnBehalfAccounts, acceptAccounts, rejectAccounts, maxRecipients, maxSendMessageSizeKB, maxReceiveMessageSizeKB, requireSenderAuthentication, null); + public void SetMailboxMailFlowSettingsAsync(int itemId, int accountId, bool enableForwarding, string forwardingAccountName, bool forwardToBoth, string[] sendOnBehalfAccounts, string[] acceptAccounts, string[] rejectAccounts, bool requireSenderAuthentication) { + this.SetMailboxMailFlowSettingsAsync(itemId, accountId, enableForwarding, forwardingAccountName, forwardToBoth, sendOnBehalfAccounts, acceptAccounts, rejectAccounts, requireSenderAuthentication, null); } /// - public void SetMailboxMailFlowSettingsAsync(int itemId, int accountId, bool enableForwarding, string forwardingAccountName, bool forwardToBoth, string[] sendOnBehalfAccounts, string[] acceptAccounts, string[] rejectAccounts, int maxRecipients, int maxSendMessageSizeKB, int maxReceiveMessageSizeKB, bool requireSenderAuthentication, object userState) { + public void SetMailboxMailFlowSettingsAsync(int itemId, int accountId, bool enableForwarding, string forwardingAccountName, bool forwardToBoth, string[] sendOnBehalfAccounts, string[] acceptAccounts, string[] rejectAccounts, bool requireSenderAuthentication, object userState) { if ((this.SetMailboxMailFlowSettingsOperationCompleted == null)) { this.SetMailboxMailFlowSettingsOperationCompleted = new System.Threading.SendOrPostCallback(this.OnSetMailboxMailFlowSettingsOperationCompleted); } @@ -2749,9 +2077,6 @@ namespace WebsitePanel.EnterpriseServer sendOnBehalfAccounts, acceptAccounts, rejectAccounts, - maxRecipients, - maxSendMessageSizeKB, - maxReceiveMessageSizeKB, requireSenderAuthentication}, this.SetMailboxMailFlowSettingsOperationCompleted, userState); } @@ -2763,117 +2088,49 @@ namespace WebsitePanel.EnterpriseServer } /// - [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://smbsaas/websitepanel/enterpriseserver/GetMailboxAdvancedSettings", RequestNamespace="http://smbsaas/websitepanel/enterpriseserver", ResponseNamespace="http://smbsaas/websitepanel/enterpriseserver", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] - public ExchangeMailbox GetMailboxAdvancedSettings(int itemId, int accountId) { - object[] results = this.Invoke("GetMailboxAdvancedSettings", new object[] { - itemId, - accountId}); - return ((ExchangeMailbox)(results[0])); - } - - /// - public System.IAsyncResult BeginGetMailboxAdvancedSettings(int itemId, int accountId, System.AsyncCallback callback, object asyncState) { - return this.BeginInvoke("GetMailboxAdvancedSettings", new object[] { - itemId, - accountId}, callback, asyncState); - } - - /// - public ExchangeMailbox EndGetMailboxAdvancedSettings(System.IAsyncResult asyncResult) { - object[] results = this.EndInvoke(asyncResult); - return ((ExchangeMailbox)(results[0])); - } - - /// - public void GetMailboxAdvancedSettingsAsync(int itemId, int accountId) { - this.GetMailboxAdvancedSettingsAsync(itemId, accountId, null); - } - - /// - public void GetMailboxAdvancedSettingsAsync(int itemId, int accountId, object userState) { - if ((this.GetMailboxAdvancedSettingsOperationCompleted == null)) { - this.GetMailboxAdvancedSettingsOperationCompleted = new System.Threading.SendOrPostCallback(this.OnGetMailboxAdvancedSettingsOperationCompleted); - } - this.InvokeAsync("GetMailboxAdvancedSettings", new object[] { - itemId, - accountId}, this.GetMailboxAdvancedSettingsOperationCompleted, userState); - } - - private void OnGetMailboxAdvancedSettingsOperationCompleted(object arg) { - if ((this.GetMailboxAdvancedSettingsCompleted != null)) { - System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); - this.GetMailboxAdvancedSettingsCompleted(this, new GetMailboxAdvancedSettingsCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); - } - } - - /// - [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://smbsaas/websitepanel/enterpriseserver/SetMailboxAdvancedSettings", RequestNamespace="http://smbsaas/websitepanel/enterpriseserver", ResponseNamespace="http://smbsaas/websitepanel/enterpriseserver", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] - public int SetMailboxAdvancedSettings(int itemId, int accountId, bool enablePOP, bool enableIMAP, bool enableOWA, bool enableMAPI, bool enableActiveSync, int issueWarningKB, int prohibitSendKB, int prohibitSendReceiveKB, int keepDeletedItemsDays) { - object[] results = this.Invoke("SetMailboxAdvancedSettings", new object[] { + [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://smbsaas/websitepanel/enterpriseserver/SetExchangeMailboxPlan", RequestNamespace="http://smbsaas/websitepanel/enterpriseserver", ResponseNamespace="http://smbsaas/websitepanel/enterpriseserver", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] + public int SetExchangeMailboxPlan(int itemId, int accountId, int mailboxPlanId) { + object[] results = this.Invoke("SetExchangeMailboxPlan", new object[] { itemId, accountId, - enablePOP, - enableIMAP, - enableOWA, - enableMAPI, - enableActiveSync, - issueWarningKB, - prohibitSendKB, - prohibitSendReceiveKB, - keepDeletedItemsDays}); + mailboxPlanId}); return ((int)(results[0])); } /// - public System.IAsyncResult BeginSetMailboxAdvancedSettings(int itemId, int accountId, bool enablePOP, bool enableIMAP, bool enableOWA, bool enableMAPI, bool enableActiveSync, int issueWarningKB, int prohibitSendKB, int prohibitSendReceiveKB, int keepDeletedItemsDays, System.AsyncCallback callback, object asyncState) { - return this.BeginInvoke("SetMailboxAdvancedSettings", new object[] { + public System.IAsyncResult BeginSetExchangeMailboxPlan(int itemId, int accountId, int mailboxPlanId, System.AsyncCallback callback, object asyncState) { + return this.BeginInvoke("SetExchangeMailboxPlan", new object[] { itemId, accountId, - enablePOP, - enableIMAP, - enableOWA, - enableMAPI, - enableActiveSync, - issueWarningKB, - prohibitSendKB, - prohibitSendReceiveKB, - keepDeletedItemsDays}, callback, asyncState); + mailboxPlanId}, callback, asyncState); } /// - public int EndSetMailboxAdvancedSettings(System.IAsyncResult asyncResult) { + public int EndSetExchangeMailboxPlan(System.IAsyncResult asyncResult) { object[] results = this.EndInvoke(asyncResult); return ((int)(results[0])); } /// - public void SetMailboxAdvancedSettingsAsync(int itemId, int accountId, bool enablePOP, bool enableIMAP, bool enableOWA, bool enableMAPI, bool enableActiveSync, int issueWarningKB, int prohibitSendKB, int prohibitSendReceiveKB, int keepDeletedItemsDays) { - this.SetMailboxAdvancedSettingsAsync(itemId, accountId, enablePOP, enableIMAP, enableOWA, enableMAPI, enableActiveSync, issueWarningKB, prohibitSendKB, prohibitSendReceiveKB, keepDeletedItemsDays, null); + public void SetExchangeMailboxPlanAsync(int itemId, int accountId, int mailboxPlanId) { + this.SetExchangeMailboxPlanAsync(itemId, accountId, mailboxPlanId, null); } /// - public void SetMailboxAdvancedSettingsAsync(int itemId, int accountId, bool enablePOP, bool enableIMAP, bool enableOWA, bool enableMAPI, bool enableActiveSync, int issueWarningKB, int prohibitSendKB, int prohibitSendReceiveKB, int keepDeletedItemsDays, object userState) { - if ((this.SetMailboxAdvancedSettingsOperationCompleted == null)) { - this.SetMailboxAdvancedSettingsOperationCompleted = new System.Threading.SendOrPostCallback(this.OnSetMailboxAdvancedSettingsOperationCompleted); + public void SetExchangeMailboxPlanAsync(int itemId, int accountId, int mailboxPlanId, object userState) { + if ((this.SetExchangeMailboxPlanOperationCompleted == null)) { + this.SetExchangeMailboxPlanOperationCompleted = new System.Threading.SendOrPostCallback(this.OnSetExchangeMailboxPlanOperationCompleted); } - this.InvokeAsync("SetMailboxAdvancedSettings", new object[] { + this.InvokeAsync("SetExchangeMailboxPlan", new object[] { itemId, accountId, - enablePOP, - enableIMAP, - enableOWA, - enableMAPI, - enableActiveSync, - issueWarningKB, - prohibitSendKB, - prohibitSendReceiveKB, - keepDeletedItemsDays}, this.SetMailboxAdvancedSettingsOperationCompleted, userState); + mailboxPlanId}, this.SetExchangeMailboxPlanOperationCompleted, userState); } - private void OnSetMailboxAdvancedSettingsOperationCompleted(object arg) { - if ((this.SetMailboxAdvancedSettingsCompleted != null)) { + private void OnSetExchangeMailboxPlanOperationCompleted(object arg) { + if ((this.SetExchangeMailboxPlanCompleted != null)) { System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); - this.SetMailboxAdvancedSettingsCompleted(this, new SetMailboxAdvancedSettingsCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); + this.SetExchangeMailboxPlanCompleted(this, new SetExchangeMailboxPlanCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); } } @@ -4160,6 +3417,436 @@ namespace WebsitePanel.EnterpriseServer } } + /// + [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://smbsaas/websitepanel/enterpriseserver/GetMobileDevices", RequestNamespace="http://smbsaas/websitepanel/enterpriseserver", ResponseNamespace="http://smbsaas/websitepanel/enterpriseserver", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] + public ExchangeMobileDevice[] GetMobileDevices(int itemId, int accountId) { + object[] results = this.Invoke("GetMobileDevices", new object[] { + itemId, + accountId}); + return ((ExchangeMobileDevice[])(results[0])); + } + + /// + public System.IAsyncResult BeginGetMobileDevices(int itemId, int accountId, System.AsyncCallback callback, object asyncState) { + return this.BeginInvoke("GetMobileDevices", new object[] { + itemId, + accountId}, callback, asyncState); + } + + /// + public ExchangeMobileDevice[] EndGetMobileDevices(System.IAsyncResult asyncResult) { + object[] results = this.EndInvoke(asyncResult); + return ((ExchangeMobileDevice[])(results[0])); + } + + /// + public void GetMobileDevicesAsync(int itemId, int accountId) { + this.GetMobileDevicesAsync(itemId, accountId, null); + } + + /// + public void GetMobileDevicesAsync(int itemId, int accountId, object userState) { + if ((this.GetMobileDevicesOperationCompleted == null)) { + this.GetMobileDevicesOperationCompleted = new System.Threading.SendOrPostCallback(this.OnGetMobileDevicesOperationCompleted); + } + this.InvokeAsync("GetMobileDevices", new object[] { + itemId, + accountId}, this.GetMobileDevicesOperationCompleted, userState); + } + + private void OnGetMobileDevicesOperationCompleted(object arg) { + if ((this.GetMobileDevicesCompleted != null)) { + System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); + this.GetMobileDevicesCompleted(this, new GetMobileDevicesCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); + } + } + + /// + [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://smbsaas/websitepanel/enterpriseserver/GetMobileDevice", RequestNamespace="http://smbsaas/websitepanel/enterpriseserver", ResponseNamespace="http://smbsaas/websitepanel/enterpriseserver", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] + public ExchangeMobileDevice GetMobileDevice(int itemId, string deviceId) { + object[] results = this.Invoke("GetMobileDevice", new object[] { + itemId, + deviceId}); + return ((ExchangeMobileDevice)(results[0])); + } + + /// + public System.IAsyncResult BeginGetMobileDevice(int itemId, string deviceId, System.AsyncCallback callback, object asyncState) { + return this.BeginInvoke("GetMobileDevice", new object[] { + itemId, + deviceId}, callback, asyncState); + } + + /// + public ExchangeMobileDevice EndGetMobileDevice(System.IAsyncResult asyncResult) { + object[] results = this.EndInvoke(asyncResult); + return ((ExchangeMobileDevice)(results[0])); + } + + /// + public void GetMobileDeviceAsync(int itemId, string deviceId) { + this.GetMobileDeviceAsync(itemId, deviceId, null); + } + + /// + public void GetMobileDeviceAsync(int itemId, string deviceId, object userState) { + if ((this.GetMobileDeviceOperationCompleted == null)) { + this.GetMobileDeviceOperationCompleted = new System.Threading.SendOrPostCallback(this.OnGetMobileDeviceOperationCompleted); + } + this.InvokeAsync("GetMobileDevice", new object[] { + itemId, + deviceId}, this.GetMobileDeviceOperationCompleted, userState); + } + + private void OnGetMobileDeviceOperationCompleted(object arg) { + if ((this.GetMobileDeviceCompleted != null)) { + System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); + this.GetMobileDeviceCompleted(this, new GetMobileDeviceCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); + } + } + + /// + [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://smbsaas/websitepanel/enterpriseserver/WipeDataFromDevice", RequestNamespace="http://smbsaas/websitepanel/enterpriseserver", ResponseNamespace="http://smbsaas/websitepanel/enterpriseserver", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] + public void WipeDataFromDevice(int itemId, string deviceId) { + this.Invoke("WipeDataFromDevice", new object[] { + itemId, + deviceId}); + } + + /// + public System.IAsyncResult BeginWipeDataFromDevice(int itemId, string deviceId, System.AsyncCallback callback, object asyncState) { + return this.BeginInvoke("WipeDataFromDevice", new object[] { + itemId, + deviceId}, callback, asyncState); + } + + /// + public void EndWipeDataFromDevice(System.IAsyncResult asyncResult) { + this.EndInvoke(asyncResult); + } + + /// + public void WipeDataFromDeviceAsync(int itemId, string deviceId) { + this.WipeDataFromDeviceAsync(itemId, deviceId, null); + } + + /// + public void WipeDataFromDeviceAsync(int itemId, string deviceId, object userState) { + if ((this.WipeDataFromDeviceOperationCompleted == null)) { + this.WipeDataFromDeviceOperationCompleted = new System.Threading.SendOrPostCallback(this.OnWipeDataFromDeviceOperationCompleted); + } + this.InvokeAsync("WipeDataFromDevice", new object[] { + itemId, + deviceId}, this.WipeDataFromDeviceOperationCompleted, userState); + } + + private void OnWipeDataFromDeviceOperationCompleted(object arg) { + if ((this.WipeDataFromDeviceCompleted != null)) { + System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); + this.WipeDataFromDeviceCompleted(this, new System.ComponentModel.AsyncCompletedEventArgs(invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); + } + } + + /// + [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://smbsaas/websitepanel/enterpriseserver/CancelRemoteWipeRequest", RequestNamespace="http://smbsaas/websitepanel/enterpriseserver", ResponseNamespace="http://smbsaas/websitepanel/enterpriseserver", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] + public void CancelRemoteWipeRequest(int itemId, string deviceId) { + this.Invoke("CancelRemoteWipeRequest", new object[] { + itemId, + deviceId}); + } + + /// + public System.IAsyncResult BeginCancelRemoteWipeRequest(int itemId, string deviceId, System.AsyncCallback callback, object asyncState) { + return this.BeginInvoke("CancelRemoteWipeRequest", new object[] { + itemId, + deviceId}, callback, asyncState); + } + + /// + public void EndCancelRemoteWipeRequest(System.IAsyncResult asyncResult) { + this.EndInvoke(asyncResult); + } + + /// + public void CancelRemoteWipeRequestAsync(int itemId, string deviceId) { + this.CancelRemoteWipeRequestAsync(itemId, deviceId, null); + } + + /// + public void CancelRemoteWipeRequestAsync(int itemId, string deviceId, object userState) { + if ((this.CancelRemoteWipeRequestOperationCompleted == null)) { + this.CancelRemoteWipeRequestOperationCompleted = new System.Threading.SendOrPostCallback(this.OnCancelRemoteWipeRequestOperationCompleted); + } + this.InvokeAsync("CancelRemoteWipeRequest", new object[] { + itemId, + deviceId}, this.CancelRemoteWipeRequestOperationCompleted, userState); + } + + private void OnCancelRemoteWipeRequestOperationCompleted(object arg) { + if ((this.CancelRemoteWipeRequestCompleted != null)) { + System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); + this.CancelRemoteWipeRequestCompleted(this, new System.ComponentModel.AsyncCompletedEventArgs(invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); + } + } + + /// + [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://smbsaas/websitepanel/enterpriseserver/RemoveDevice", RequestNamespace="http://smbsaas/websitepanel/enterpriseserver", ResponseNamespace="http://smbsaas/websitepanel/enterpriseserver", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] + public void RemoveDevice(int itemId, string deviceId) { + this.Invoke("RemoveDevice", new object[] { + itemId, + deviceId}); + } + + /// + public System.IAsyncResult BeginRemoveDevice(int itemId, string deviceId, System.AsyncCallback callback, object asyncState) { + return this.BeginInvoke("RemoveDevice", new object[] { + itemId, + deviceId}, callback, asyncState); + } + + /// + public void EndRemoveDevice(System.IAsyncResult asyncResult) { + this.EndInvoke(asyncResult); + } + + /// + public void RemoveDeviceAsync(int itemId, string deviceId) { + this.RemoveDeviceAsync(itemId, deviceId, null); + } + + /// + public void RemoveDeviceAsync(int itemId, string deviceId, object userState) { + if ((this.RemoveDeviceOperationCompleted == null)) { + this.RemoveDeviceOperationCompleted = new System.Threading.SendOrPostCallback(this.OnRemoveDeviceOperationCompleted); + } + this.InvokeAsync("RemoveDevice", new object[] { + itemId, + deviceId}, this.RemoveDeviceOperationCompleted, userState); + } + + private void OnRemoveDeviceOperationCompleted(object arg) { + if ((this.RemoveDeviceCompleted != null)) { + System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); + this.RemoveDeviceCompleted(this, new System.ComponentModel.AsyncCompletedEventArgs(invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); + } + } + + /// + [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://smbsaas/websitepanel/enterpriseserver/GetExchangeMailboxPlans", RequestNamespace="http://smbsaas/websitepanel/enterpriseserver", ResponseNamespace="http://smbsaas/websitepanel/enterpriseserver", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] + public ExchangeMailboxPlan[] GetExchangeMailboxPlans(int itemId) { + object[] results = this.Invoke("GetExchangeMailboxPlans", new object[] { + itemId}); + return ((ExchangeMailboxPlan[])(results[0])); + } + + /// + public System.IAsyncResult BeginGetExchangeMailboxPlans(int itemId, System.AsyncCallback callback, object asyncState) { + return this.BeginInvoke("GetExchangeMailboxPlans", new object[] { + itemId}, callback, asyncState); + } + + /// + public ExchangeMailboxPlan[] EndGetExchangeMailboxPlans(System.IAsyncResult asyncResult) { + object[] results = this.EndInvoke(asyncResult); + return ((ExchangeMailboxPlan[])(results[0])); + } + + /// + public void GetExchangeMailboxPlansAsync(int itemId) { + this.GetExchangeMailboxPlansAsync(itemId, null); + } + + /// + public void GetExchangeMailboxPlansAsync(int itemId, object userState) { + if ((this.GetExchangeMailboxPlansOperationCompleted == null)) { + this.GetExchangeMailboxPlansOperationCompleted = new System.Threading.SendOrPostCallback(this.OnGetExchangeMailboxPlansOperationCompleted); + } + this.InvokeAsync("GetExchangeMailboxPlans", new object[] { + itemId}, this.GetExchangeMailboxPlansOperationCompleted, userState); + } + + private void OnGetExchangeMailboxPlansOperationCompleted(object arg) { + if ((this.GetExchangeMailboxPlansCompleted != null)) { + System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); + this.GetExchangeMailboxPlansCompleted(this, new GetExchangeMailboxPlansCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); + } + } + + /// + [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://smbsaas/websitepanel/enterpriseserver/GetExchangeMailboxPlan", RequestNamespace="http://smbsaas/websitepanel/enterpriseserver", ResponseNamespace="http://smbsaas/websitepanel/enterpriseserver", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] + public ExchangeMailboxPlan GetExchangeMailboxPlan(int itemId, int mailboxPlanId) { + object[] results = this.Invoke("GetExchangeMailboxPlan", new object[] { + itemId, + mailboxPlanId}); + return ((ExchangeMailboxPlan)(results[0])); + } + + /// + public System.IAsyncResult BeginGetExchangeMailboxPlan(int itemId, int mailboxPlanId, System.AsyncCallback callback, object asyncState) { + return this.BeginInvoke("GetExchangeMailboxPlan", new object[] { + itemId, + mailboxPlanId}, callback, asyncState); + } + + /// + public ExchangeMailboxPlan EndGetExchangeMailboxPlan(System.IAsyncResult asyncResult) { + object[] results = this.EndInvoke(asyncResult); + return ((ExchangeMailboxPlan)(results[0])); + } + + /// + public void GetExchangeMailboxPlanAsync(int itemId, int mailboxPlanId) { + this.GetExchangeMailboxPlanAsync(itemId, mailboxPlanId, null); + } + + /// + public void GetExchangeMailboxPlanAsync(int itemId, int mailboxPlanId, object userState) { + if ((this.GetExchangeMailboxPlanOperationCompleted == null)) { + this.GetExchangeMailboxPlanOperationCompleted = new System.Threading.SendOrPostCallback(this.OnGetExchangeMailboxPlanOperationCompleted); + } + this.InvokeAsync("GetExchangeMailboxPlan", new object[] { + itemId, + mailboxPlanId}, this.GetExchangeMailboxPlanOperationCompleted, userState); + } + + private void OnGetExchangeMailboxPlanOperationCompleted(object arg) { + if ((this.GetExchangeMailboxPlanCompleted != null)) { + System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); + this.GetExchangeMailboxPlanCompleted(this, new GetExchangeMailboxPlanCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); + } + } + + /// + [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://smbsaas/websitepanel/enterpriseserver/AddExchangeMailboxPlan", RequestNamespace="http://smbsaas/websitepanel/enterpriseserver", ResponseNamespace="http://smbsaas/websitepanel/enterpriseserver", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] + public int AddExchangeMailboxPlan(int itemId, ExchangeMailboxPlan mailboxPlan) { + object[] results = this.Invoke("AddExchangeMailboxPlan", new object[] { + itemId, + mailboxPlan}); + return ((int)(results[0])); + } + + /// + public System.IAsyncResult BeginAddExchangeMailboxPlan(int itemId, ExchangeMailboxPlan mailboxPlan, System.AsyncCallback callback, object asyncState) { + return this.BeginInvoke("AddExchangeMailboxPlan", new object[] { + itemId, + mailboxPlan}, callback, asyncState); + } + + /// + public int EndAddExchangeMailboxPlan(System.IAsyncResult asyncResult) { + object[] results = this.EndInvoke(asyncResult); + return ((int)(results[0])); + } + + /// + public void AddExchangeMailboxPlanAsync(int itemId, ExchangeMailboxPlan mailboxPlan) { + this.AddExchangeMailboxPlanAsync(itemId, mailboxPlan, null); + } + + /// + public void AddExchangeMailboxPlanAsync(int itemId, ExchangeMailboxPlan mailboxPlan, object userState) { + if ((this.AddExchangeMailboxPlanOperationCompleted == null)) { + this.AddExchangeMailboxPlanOperationCompleted = new System.Threading.SendOrPostCallback(this.OnAddExchangeMailboxPlanOperationCompleted); + } + this.InvokeAsync("AddExchangeMailboxPlan", new object[] { + itemId, + mailboxPlan}, this.AddExchangeMailboxPlanOperationCompleted, userState); + } + + private void OnAddExchangeMailboxPlanOperationCompleted(object arg) { + if ((this.AddExchangeMailboxPlanCompleted != null)) { + System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); + this.AddExchangeMailboxPlanCompleted(this, new AddExchangeMailboxPlanCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); + } + } + + /// + [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://smbsaas/websitepanel/enterpriseserver/DeleteExchangeMailboxPlan", RequestNamespace="http://smbsaas/websitepanel/enterpriseserver", ResponseNamespace="http://smbsaas/websitepanel/enterpriseserver", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] + public int DeleteExchangeMailboxPlan(int itemId, int mailboxPlanId) { + object[] results = this.Invoke("DeleteExchangeMailboxPlan", new object[] { + itemId, + mailboxPlanId}); + return ((int)(results[0])); + } + + /// + public System.IAsyncResult BeginDeleteExchangeMailboxPlan(int itemId, int mailboxPlanId, System.AsyncCallback callback, object asyncState) { + return this.BeginInvoke("DeleteExchangeMailboxPlan", new object[] { + itemId, + mailboxPlanId}, callback, asyncState); + } + + /// + public int EndDeleteExchangeMailboxPlan(System.IAsyncResult asyncResult) { + object[] results = this.EndInvoke(asyncResult); + return ((int)(results[0])); + } + + /// + public void DeleteExchangeMailboxPlanAsync(int itemId, int mailboxPlanId) { + this.DeleteExchangeMailboxPlanAsync(itemId, mailboxPlanId, null); + } + + /// + public void DeleteExchangeMailboxPlanAsync(int itemId, int mailboxPlanId, object userState) { + if ((this.DeleteExchangeMailboxPlanOperationCompleted == null)) { + this.DeleteExchangeMailboxPlanOperationCompleted = new System.Threading.SendOrPostCallback(this.OnDeleteExchangeMailboxPlanOperationCompleted); + } + this.InvokeAsync("DeleteExchangeMailboxPlan", new object[] { + itemId, + mailboxPlanId}, this.DeleteExchangeMailboxPlanOperationCompleted, userState); + } + + private void OnDeleteExchangeMailboxPlanOperationCompleted(object arg) { + if ((this.DeleteExchangeMailboxPlanCompleted != null)) { + System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); + this.DeleteExchangeMailboxPlanCompleted(this, new DeleteExchangeMailboxPlanCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); + } + } + + /// + [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://smbsaas/websitepanel/enterpriseserver/SetOrganizationDefaultExchangeMailbo" + + "xPlan", RequestNamespace="http://smbsaas/websitepanel/enterpriseserver", ResponseNamespace="http://smbsaas/websitepanel/enterpriseserver", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] + public void SetOrganizationDefaultExchangeMailboxPlan(int itemId, int mailboxPlanId) { + this.Invoke("SetOrganizationDefaultExchangeMailboxPlan", new object[] { + itemId, + mailboxPlanId}); + } + + /// + public System.IAsyncResult BeginSetOrganizationDefaultExchangeMailboxPlan(int itemId, int mailboxPlanId, System.AsyncCallback callback, object asyncState) { + return this.BeginInvoke("SetOrganizationDefaultExchangeMailboxPlan", new object[] { + itemId, + mailboxPlanId}, callback, asyncState); + } + + /// + public void EndSetOrganizationDefaultExchangeMailboxPlan(System.IAsyncResult asyncResult) { + this.EndInvoke(asyncResult); + } + + /// + public void SetOrganizationDefaultExchangeMailboxPlanAsync(int itemId, int mailboxPlanId) { + this.SetOrganizationDefaultExchangeMailboxPlanAsync(itemId, mailboxPlanId, null); + } + + /// + public void SetOrganizationDefaultExchangeMailboxPlanAsync(int itemId, int mailboxPlanId, object userState) { + if ((this.SetOrganizationDefaultExchangeMailboxPlanOperationCompleted == null)) { + this.SetOrganizationDefaultExchangeMailboxPlanOperationCompleted = new System.Threading.SendOrPostCallback(this.OnSetOrganizationDefaultExchangeMailboxPlanOperationCompleted); + } + this.InvokeAsync("SetOrganizationDefaultExchangeMailboxPlan", new object[] { + itemId, + mailboxPlanId}, this.SetOrganizationDefaultExchangeMailboxPlanOperationCompleted, userState); + } + + private void OnSetOrganizationDefaultExchangeMailboxPlanOperationCompleted(object arg) { + if ((this.SetOrganizationDefaultExchangeMailboxPlanCompleted != null)) { + System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); + this.SetOrganizationDefaultExchangeMailboxPlanCompleted(this, new System.ComponentModel.AsyncCompletedEventArgs(invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); + } + } + /// [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://smbsaas/websitepanel/enterpriseserver/CreatePublicFolder", RequestNamespace="http://smbsaas/websitepanel/enterpriseserver", ResponseNamespace="http://smbsaas/websitepanel/enterpriseserver", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] public int CreatePublicFolder(int itemId, string parentFolder, string folderName, bool mailEnabled, string accountName, string domain) { @@ -4495,232 +4182,294 @@ namespace WebsitePanel.EnterpriseServer } } + /// + [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://smbsaas/websitepanel/enterpriseserver/GetPublicFolderMailFlowSettings", RequestNamespace="http://smbsaas/websitepanel/enterpriseserver", ResponseNamespace="http://smbsaas/websitepanel/enterpriseserver", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] + public ExchangePublicFolder GetPublicFolderMailFlowSettings(int itemId, int accountId) { + object[] results = this.Invoke("GetPublicFolderMailFlowSettings", new object[] { + itemId, + accountId}); + return ((ExchangePublicFolder)(results[0])); + } + + /// + public System.IAsyncResult BeginGetPublicFolderMailFlowSettings(int itemId, int accountId, System.AsyncCallback callback, object asyncState) { + return this.BeginInvoke("GetPublicFolderMailFlowSettings", new object[] { + itemId, + accountId}, callback, asyncState); + } + + /// + public ExchangePublicFolder EndGetPublicFolderMailFlowSettings(System.IAsyncResult asyncResult) { + object[] results = this.EndInvoke(asyncResult); + return ((ExchangePublicFolder)(results[0])); + } + + /// + public void GetPublicFolderMailFlowSettingsAsync(int itemId, int accountId) { + this.GetPublicFolderMailFlowSettingsAsync(itemId, accountId, null); + } + + /// + public void GetPublicFolderMailFlowSettingsAsync(int itemId, int accountId, object userState) { + if ((this.GetPublicFolderMailFlowSettingsOperationCompleted == null)) { + this.GetPublicFolderMailFlowSettingsOperationCompleted = new System.Threading.SendOrPostCallback(this.OnGetPublicFolderMailFlowSettingsOperationCompleted); + } + this.InvokeAsync("GetPublicFolderMailFlowSettings", new object[] { + itemId, + accountId}, this.GetPublicFolderMailFlowSettingsOperationCompleted, userState); + } + + private void OnGetPublicFolderMailFlowSettingsOperationCompleted(object arg) { + if ((this.GetPublicFolderMailFlowSettingsCompleted != null)) { + System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); + this.GetPublicFolderMailFlowSettingsCompleted(this, new GetPublicFolderMailFlowSettingsCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); + } + } + + /// + [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://smbsaas/websitepanel/enterpriseserver/SetPublicFolderMailFlowSettings", RequestNamespace="http://smbsaas/websitepanel/enterpriseserver", ResponseNamespace="http://smbsaas/websitepanel/enterpriseserver", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] + public int SetPublicFolderMailFlowSettings(int itemId, int accountId, string[] acceptAccounts, string[] rejectAccounts, bool requireSenderAuthentication) { + object[] results = this.Invoke("SetPublicFolderMailFlowSettings", new object[] { + itemId, + accountId, + acceptAccounts, + rejectAccounts, + requireSenderAuthentication}); + return ((int)(results[0])); + } + + /// + public System.IAsyncResult BeginSetPublicFolderMailFlowSettings(int itemId, int accountId, string[] acceptAccounts, string[] rejectAccounts, bool requireSenderAuthentication, System.AsyncCallback callback, object asyncState) { + return this.BeginInvoke("SetPublicFolderMailFlowSettings", new object[] { + itemId, + accountId, + acceptAccounts, + rejectAccounts, + requireSenderAuthentication}, callback, asyncState); + } + + /// + public int EndSetPublicFolderMailFlowSettings(System.IAsyncResult asyncResult) { + object[] results = this.EndInvoke(asyncResult); + return ((int)(results[0])); + } + + /// + public void SetPublicFolderMailFlowSettingsAsync(int itemId, int accountId, string[] acceptAccounts, string[] rejectAccounts, bool requireSenderAuthentication) { + this.SetPublicFolderMailFlowSettingsAsync(itemId, accountId, acceptAccounts, rejectAccounts, requireSenderAuthentication, null); + } + + /// + public void SetPublicFolderMailFlowSettingsAsync(int itemId, int accountId, string[] acceptAccounts, string[] rejectAccounts, bool requireSenderAuthentication, object userState) { + if ((this.SetPublicFolderMailFlowSettingsOperationCompleted == null)) { + this.SetPublicFolderMailFlowSettingsOperationCompleted = new System.Threading.SendOrPostCallback(this.OnSetPublicFolderMailFlowSettingsOperationCompleted); + } + this.InvokeAsync("SetPublicFolderMailFlowSettings", new object[] { + itemId, + accountId, + acceptAccounts, + rejectAccounts, + requireSenderAuthentication}, this.SetPublicFolderMailFlowSettingsOperationCompleted, userState); + } + + private void OnSetPublicFolderMailFlowSettingsOperationCompleted(object arg) { + if ((this.SetPublicFolderMailFlowSettingsCompleted != null)) { + System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); + this.SetPublicFolderMailFlowSettingsCompleted(this, new SetPublicFolderMailFlowSettingsCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); + } + } + + /// + [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://smbsaas/websitepanel/enterpriseserver/GetPublicFolderEmailAddresses", RequestNamespace="http://smbsaas/websitepanel/enterpriseserver", ResponseNamespace="http://smbsaas/websitepanel/enterpriseserver", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] + public ExchangeEmailAddress[] GetPublicFolderEmailAddresses(int itemId, int accountId) { + object[] results = this.Invoke("GetPublicFolderEmailAddresses", new object[] { + itemId, + accountId}); + return ((ExchangeEmailAddress[])(results[0])); + } + + /// + public System.IAsyncResult BeginGetPublicFolderEmailAddresses(int itemId, int accountId, System.AsyncCallback callback, object asyncState) { + return this.BeginInvoke("GetPublicFolderEmailAddresses", new object[] { + itemId, + accountId}, callback, asyncState); + } + + /// + public ExchangeEmailAddress[] EndGetPublicFolderEmailAddresses(System.IAsyncResult asyncResult) { + object[] results = this.EndInvoke(asyncResult); + return ((ExchangeEmailAddress[])(results[0])); + } + + /// + public void GetPublicFolderEmailAddressesAsync(int itemId, int accountId) { + this.GetPublicFolderEmailAddressesAsync(itemId, accountId, null); + } + + /// + public void GetPublicFolderEmailAddressesAsync(int itemId, int accountId, object userState) { + if ((this.GetPublicFolderEmailAddressesOperationCompleted == null)) { + this.GetPublicFolderEmailAddressesOperationCompleted = new System.Threading.SendOrPostCallback(this.OnGetPublicFolderEmailAddressesOperationCompleted); + } + this.InvokeAsync("GetPublicFolderEmailAddresses", new object[] { + itemId, + accountId}, this.GetPublicFolderEmailAddressesOperationCompleted, userState); + } + + private void OnGetPublicFolderEmailAddressesOperationCompleted(object arg) { + if ((this.GetPublicFolderEmailAddressesCompleted != null)) { + System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); + this.GetPublicFolderEmailAddressesCompleted(this, new GetPublicFolderEmailAddressesCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); + } + } + + /// + [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://smbsaas/websitepanel/enterpriseserver/AddPublicFolderEmailAddress", RequestNamespace="http://smbsaas/websitepanel/enterpriseserver", ResponseNamespace="http://smbsaas/websitepanel/enterpriseserver", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] + public int AddPublicFolderEmailAddress(int itemId, int accountId, string emailAddress) { + object[] results = this.Invoke("AddPublicFolderEmailAddress", new object[] { + itemId, + accountId, + emailAddress}); + return ((int)(results[0])); + } + + /// + public System.IAsyncResult BeginAddPublicFolderEmailAddress(int itemId, int accountId, string emailAddress, System.AsyncCallback callback, object asyncState) { + return this.BeginInvoke("AddPublicFolderEmailAddress", new object[] { + itemId, + accountId, + emailAddress}, callback, asyncState); + } + + /// + public int EndAddPublicFolderEmailAddress(System.IAsyncResult asyncResult) { + object[] results = this.EndInvoke(asyncResult); + return ((int)(results[0])); + } + + /// + public void AddPublicFolderEmailAddressAsync(int itemId, int accountId, string emailAddress) { + this.AddPublicFolderEmailAddressAsync(itemId, accountId, emailAddress, null); + } + + /// + public void AddPublicFolderEmailAddressAsync(int itemId, int accountId, string emailAddress, object userState) { + if ((this.AddPublicFolderEmailAddressOperationCompleted == null)) { + this.AddPublicFolderEmailAddressOperationCompleted = new System.Threading.SendOrPostCallback(this.OnAddPublicFolderEmailAddressOperationCompleted); + } + this.InvokeAsync("AddPublicFolderEmailAddress", new object[] { + itemId, + accountId, + emailAddress}, this.AddPublicFolderEmailAddressOperationCompleted, userState); + } + + private void OnAddPublicFolderEmailAddressOperationCompleted(object arg) { + if ((this.AddPublicFolderEmailAddressCompleted != null)) { + System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); + this.AddPublicFolderEmailAddressCompleted(this, new AddPublicFolderEmailAddressCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); + } + } + + /// + [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://smbsaas/websitepanel/enterpriseserver/SetPublicFolderPrimaryEmailAddress", RequestNamespace="http://smbsaas/websitepanel/enterpriseserver", ResponseNamespace="http://smbsaas/websitepanel/enterpriseserver", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] + public int SetPublicFolderPrimaryEmailAddress(int itemId, int accountId, string emailAddress) { + object[] results = this.Invoke("SetPublicFolderPrimaryEmailAddress", new object[] { + itemId, + accountId, + emailAddress}); + return ((int)(results[0])); + } + + /// + public System.IAsyncResult BeginSetPublicFolderPrimaryEmailAddress(int itemId, int accountId, string emailAddress, System.AsyncCallback callback, object asyncState) { + return this.BeginInvoke("SetPublicFolderPrimaryEmailAddress", new object[] { + itemId, + accountId, + emailAddress}, callback, asyncState); + } + + /// + public int EndSetPublicFolderPrimaryEmailAddress(System.IAsyncResult asyncResult) { + object[] results = this.EndInvoke(asyncResult); + return ((int)(results[0])); + } + + /// + public void SetPublicFolderPrimaryEmailAddressAsync(int itemId, int accountId, string emailAddress) { + this.SetPublicFolderPrimaryEmailAddressAsync(itemId, accountId, emailAddress, null); + } + + /// + public void SetPublicFolderPrimaryEmailAddressAsync(int itemId, int accountId, string emailAddress, object userState) { + if ((this.SetPublicFolderPrimaryEmailAddressOperationCompleted == null)) { + this.SetPublicFolderPrimaryEmailAddressOperationCompleted = new System.Threading.SendOrPostCallback(this.OnSetPublicFolderPrimaryEmailAddressOperationCompleted); + } + this.InvokeAsync("SetPublicFolderPrimaryEmailAddress", new object[] { + itemId, + accountId, + emailAddress}, this.SetPublicFolderPrimaryEmailAddressOperationCompleted, userState); + } + + private void OnSetPublicFolderPrimaryEmailAddressOperationCompleted(object arg) { + if ((this.SetPublicFolderPrimaryEmailAddressCompleted != null)) { + System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); + this.SetPublicFolderPrimaryEmailAddressCompleted(this, new SetPublicFolderPrimaryEmailAddressCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); + } + } + + /// + [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://smbsaas/websitepanel/enterpriseserver/DeletePublicFolderEmailAddresses", RequestNamespace="http://smbsaas/websitepanel/enterpriseserver", ResponseNamespace="http://smbsaas/websitepanel/enterpriseserver", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] + public int DeletePublicFolderEmailAddresses(int itemId, int accountId, string[] emailAddresses) { + object[] results = this.Invoke("DeletePublicFolderEmailAddresses", new object[] { + itemId, + accountId, + emailAddresses}); + return ((int)(results[0])); + } + + /// + public System.IAsyncResult BeginDeletePublicFolderEmailAddresses(int itemId, int accountId, string[] emailAddresses, System.AsyncCallback callback, object asyncState) { + return this.BeginInvoke("DeletePublicFolderEmailAddresses", new object[] { + itemId, + accountId, + emailAddresses}, callback, asyncState); + } + + /// + public int EndDeletePublicFolderEmailAddresses(System.IAsyncResult asyncResult) { + object[] results = this.EndInvoke(asyncResult); + return ((int)(results[0])); + } + + /// + public void DeletePublicFolderEmailAddressesAsync(int itemId, int accountId, string[] emailAddresses) { + this.DeletePublicFolderEmailAddressesAsync(itemId, accountId, emailAddresses, null); + } + + /// + public void DeletePublicFolderEmailAddressesAsync(int itemId, int accountId, string[] emailAddresses, object userState) { + if ((this.DeletePublicFolderEmailAddressesOperationCompleted == null)) { + this.DeletePublicFolderEmailAddressesOperationCompleted = new System.Threading.SendOrPostCallback(this.OnDeletePublicFolderEmailAddressesOperationCompleted); + } + this.InvokeAsync("DeletePublicFolderEmailAddresses", new object[] { + itemId, + accountId, + emailAddresses}, this.DeletePublicFolderEmailAddressesOperationCompleted, userState); + } + + private void OnDeletePublicFolderEmailAddressesOperationCompleted(object arg) { + if ((this.DeletePublicFolderEmailAddressesCompleted != null)) { + System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); + this.DeletePublicFolderEmailAddressesCompleted(this, new DeletePublicFolderEmailAddressesCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); + } + } + /// public new void CancelAsync(object userState) { base.CancelAsync(userState); } } - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] - public delegate void GetPublicFolderMailFlowSettingsCompletedEventHandler(object sender, GetPublicFolderMailFlowSettingsCompletedEventArgs e); - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] - [System.Diagnostics.DebuggerStepThroughAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - public partial class GetPublicFolderMailFlowSettingsCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { - - private object[] results; - - internal GetPublicFolderMailFlowSettingsCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : - base(exception, cancelled, userState) { - this.results = results; - } - - /// - public ExchangePublicFolder Result { - get { - this.RaiseExceptionIfNecessary(); - return ((ExchangePublicFolder)(this.results[0])); - } - } - } - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] - public delegate void SetPublicFolderMailFlowSettingsCompletedEventHandler(object sender, SetPublicFolderMailFlowSettingsCompletedEventArgs e); - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] - [System.Diagnostics.DebuggerStepThroughAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - public partial class SetPublicFolderMailFlowSettingsCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { - - private object[] results; - - internal SetPublicFolderMailFlowSettingsCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : - base(exception, cancelled, userState) { - this.results = results; - } - - /// - public int Result { - get { - this.RaiseExceptionIfNecessary(); - return ((int)(this.results[0])); - } - } - } - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] - public delegate void GetPublicFolderEmailAddressesCompletedEventHandler(object sender, GetPublicFolderEmailAddressesCompletedEventArgs e); - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] - [System.Diagnostics.DebuggerStepThroughAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - public partial class GetPublicFolderEmailAddressesCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { - - private object[] results; - - internal GetPublicFolderEmailAddressesCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : - base(exception, cancelled, userState) { - this.results = results; - } - - /// - public ExchangeEmailAddress[] Result { - get { - this.RaiseExceptionIfNecessary(); - return ((ExchangeEmailAddress[])(this.results[0])); - } - } - } - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] - public delegate void AddPublicFolderEmailAddressCompletedEventHandler(object sender, AddPublicFolderEmailAddressCompletedEventArgs e); - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] - [System.Diagnostics.DebuggerStepThroughAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - public partial class AddPublicFolderEmailAddressCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { - - private object[] results; - - internal AddPublicFolderEmailAddressCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : - base(exception, cancelled, userState) { - this.results = results; - } - - /// - public int Result { - get { - this.RaiseExceptionIfNecessary(); - return ((int)(this.results[0])); - } - } - } - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] - public delegate void SetPublicFolderPrimaryEmailAddressCompletedEventHandler(object sender, SetPublicFolderPrimaryEmailAddressCompletedEventArgs e); - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] - [System.Diagnostics.DebuggerStepThroughAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - public partial class SetPublicFolderPrimaryEmailAddressCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { - - private object[] results; - - internal SetPublicFolderPrimaryEmailAddressCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : - base(exception, cancelled, userState) { - this.results = results; - } - - /// - public int Result { - get { - this.RaiseExceptionIfNecessary(); - return ((int)(this.results[0])); - } - } - } - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] - public delegate void DeletePublicFolderEmailAddressesCompletedEventHandler(object sender, DeletePublicFolderEmailAddressesCompletedEventArgs e); - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] - [System.Diagnostics.DebuggerStepThroughAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - public partial class DeletePublicFolderEmailAddressesCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { - - private object[] results; - - internal DeletePublicFolderEmailAddressesCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : - base(exception, cancelled, userState) { - this.results = results; - } - - /// - public int Result { - get { - this.RaiseExceptionIfNecessary(); - return ((int)(this.results[0])); - } - } - } - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] - public delegate void GetMobileDevicesCompletedEventHandler(object sender, GetMobileDevicesCompletedEventArgs e); - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] - [System.Diagnostics.DebuggerStepThroughAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - public partial class GetMobileDevicesCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { - - private object[] results; - - internal GetMobileDevicesCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : - base(exception, cancelled, userState) { - this.results = results; - } - - /// - public ExchangeMobileDevice[] Result { - get { - this.RaiseExceptionIfNecessary(); - return ((ExchangeMobileDevice[])(this.results[0])); - } - } - } - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] - public delegate void GetMobileDeviceCompletedEventHandler(object sender, GetMobileDeviceCompletedEventArgs e); - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] - [System.Diagnostics.DebuggerStepThroughAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - public partial class GetMobileDeviceCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { - - private object[] results; - - internal GetMobileDeviceCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : - base(exception, cancelled, userState) { - this.results = results; - } - - /// - public ExchangeMobileDevice Result { - get { - this.RaiseExceptionIfNecessary(); - return ((ExchangeMobileDevice)(this.results[0])); - } - } - } - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] - public delegate void WipeDataFromDeviceCompletedEventHandler(object sender, System.ComponentModel.AsyncCompletedEventArgs e); - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] - public delegate void CancelRemoteWipeRequestCompletedEventHandler(object sender, System.ComponentModel.AsyncCompletedEventArgs e); - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] - public delegate void RemoveDeviceCompletedEventHandler(object sender, System.ComponentModel.AsyncCompletedEventArgs e); - /// [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] public delegate void GetRawExchangeOrganizationsPagedCompletedEventHandler(object sender, GetRawExchangeOrganizationsPagedCompletedEventArgs e); @@ -4957,26 +4706,26 @@ namespace WebsitePanel.EnterpriseServer /// [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] - public delegate void GetPublicFoldersStatisticsCompletedEventHandler(object sender, GetPublicFoldersStatisticsCompletedEventArgs e); + public delegate void GetMailboxStatisticsCompletedEventHandler(object sender, GetMailboxStatisticsCompletedEventArgs e); /// [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] [System.Diagnostics.DebuggerStepThroughAttribute()] [System.ComponentModel.DesignerCategoryAttribute("code")] - public partial class GetPublicFoldersStatisticsCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { + public partial class GetMailboxStatisticsCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { private object[] results; - internal GetPublicFoldersStatisticsCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + internal GetMailboxStatisticsCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : base(exception, cancelled, userState) { this.results = results; } /// - public ExchangeItemStatistics[] Result { + public ExchangeMailboxStatistics Result { get { this.RaiseExceptionIfNecessary(); - return ((ExchangeItemStatistics[])(this.results[0])); + return ((ExchangeMailboxStatistics)(this.results[0])); } } } @@ -5555,43 +5304,17 @@ namespace WebsitePanel.EnterpriseServer /// [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] - public delegate void GetMailboxAdvancedSettingsCompletedEventHandler(object sender, GetMailboxAdvancedSettingsCompletedEventArgs e); + public delegate void SetExchangeMailboxPlanCompletedEventHandler(object sender, SetExchangeMailboxPlanCompletedEventArgs e); /// [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] [System.Diagnostics.DebuggerStepThroughAttribute()] [System.ComponentModel.DesignerCategoryAttribute("code")] - public partial class GetMailboxAdvancedSettingsCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { + public partial class SetExchangeMailboxPlanCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { private object[] results; - internal GetMailboxAdvancedSettingsCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : - base(exception, cancelled, userState) { - this.results = results; - } - - /// - public ExchangeMailbox Result { - get { - this.RaiseExceptionIfNecessary(); - return ((ExchangeMailbox)(this.results[0])); - } - } - } - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] - public delegate void SetMailboxAdvancedSettingsCompletedEventHandler(object sender, SetMailboxAdvancedSettingsCompletedEventArgs e); - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] - [System.Diagnostics.DebuggerStepThroughAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - public partial class SetMailboxAdvancedSettingsCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { - - private object[] results; - - internal SetMailboxAdvancedSettingsCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + internal SetExchangeMailboxPlanCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : base(exception, cancelled, userState) { this.results = results; } @@ -6203,6 +5926,178 @@ namespace WebsitePanel.EnterpriseServer } } + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + public delegate void GetMobileDevicesCompletedEventHandler(object sender, GetMobileDevicesCompletedEventArgs e); + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + public partial class GetMobileDevicesCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { + + private object[] results; + + internal GetMobileDevicesCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + base(exception, cancelled, userState) { + this.results = results; + } + + /// + public ExchangeMobileDevice[] Result { + get { + this.RaiseExceptionIfNecessary(); + return ((ExchangeMobileDevice[])(this.results[0])); + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + public delegate void GetMobileDeviceCompletedEventHandler(object sender, GetMobileDeviceCompletedEventArgs e); + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + public partial class GetMobileDeviceCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { + + private object[] results; + + internal GetMobileDeviceCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + base(exception, cancelled, userState) { + this.results = results; + } + + /// + public ExchangeMobileDevice Result { + get { + this.RaiseExceptionIfNecessary(); + return ((ExchangeMobileDevice)(this.results[0])); + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + public delegate void WipeDataFromDeviceCompletedEventHandler(object sender, System.ComponentModel.AsyncCompletedEventArgs e); + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + public delegate void CancelRemoteWipeRequestCompletedEventHandler(object sender, System.ComponentModel.AsyncCompletedEventArgs e); + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + public delegate void RemoveDeviceCompletedEventHandler(object sender, System.ComponentModel.AsyncCompletedEventArgs e); + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + public delegate void GetExchangeMailboxPlansCompletedEventHandler(object sender, GetExchangeMailboxPlansCompletedEventArgs e); + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + public partial class GetExchangeMailboxPlansCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { + + private object[] results; + + internal GetExchangeMailboxPlansCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + base(exception, cancelled, userState) { + this.results = results; + } + + /// + public ExchangeMailboxPlan[] Result { + get { + this.RaiseExceptionIfNecessary(); + return ((ExchangeMailboxPlan[])(this.results[0])); + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + public delegate void GetExchangeMailboxPlanCompletedEventHandler(object sender, GetExchangeMailboxPlanCompletedEventArgs e); + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + public partial class GetExchangeMailboxPlanCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { + + private object[] results; + + internal GetExchangeMailboxPlanCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + base(exception, cancelled, userState) { + this.results = results; + } + + /// + public ExchangeMailboxPlan Result { + get { + this.RaiseExceptionIfNecessary(); + return ((ExchangeMailboxPlan)(this.results[0])); + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + public delegate void AddExchangeMailboxPlanCompletedEventHandler(object sender, AddExchangeMailboxPlanCompletedEventArgs e); + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + public partial class AddExchangeMailboxPlanCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { + + private object[] results; + + internal AddExchangeMailboxPlanCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + base(exception, cancelled, userState) { + this.results = results; + } + + /// + public int Result { + get { + this.RaiseExceptionIfNecessary(); + return ((int)(this.results[0])); + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + public delegate void DeleteExchangeMailboxPlanCompletedEventHandler(object sender, DeleteExchangeMailboxPlanCompletedEventArgs e); + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + public partial class DeleteExchangeMailboxPlanCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { + + private object[] results; + + internal DeleteExchangeMailboxPlanCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + base(exception, cancelled, userState) { + this.results = results; + } + + /// + public int Result { + get { + this.RaiseExceptionIfNecessary(); + return ((int)(this.results[0])); + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + public delegate void SetOrganizationDefaultExchangeMailboxPlanCompletedEventHandler(object sender, System.ComponentModel.AsyncCompletedEventArgs e); + /// [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] public delegate void CreatePublicFolderCompletedEventHandler(object sender, CreatePublicFolderCompletedEventArgs e); @@ -6384,4 +6279,160 @@ namespace WebsitePanel.EnterpriseServer } } } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + public delegate void GetPublicFolderMailFlowSettingsCompletedEventHandler(object sender, GetPublicFolderMailFlowSettingsCompletedEventArgs e); + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + public partial class GetPublicFolderMailFlowSettingsCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { + + private object[] results; + + internal GetPublicFolderMailFlowSettingsCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + base(exception, cancelled, userState) { + this.results = results; + } + + /// + public ExchangePublicFolder Result { + get { + this.RaiseExceptionIfNecessary(); + return ((ExchangePublicFolder)(this.results[0])); + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + public delegate void SetPublicFolderMailFlowSettingsCompletedEventHandler(object sender, SetPublicFolderMailFlowSettingsCompletedEventArgs e); + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + public partial class SetPublicFolderMailFlowSettingsCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { + + private object[] results; + + internal SetPublicFolderMailFlowSettingsCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + base(exception, cancelled, userState) { + this.results = results; + } + + /// + public int Result { + get { + this.RaiseExceptionIfNecessary(); + return ((int)(this.results[0])); + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + public delegate void GetPublicFolderEmailAddressesCompletedEventHandler(object sender, GetPublicFolderEmailAddressesCompletedEventArgs e); + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + public partial class GetPublicFolderEmailAddressesCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { + + private object[] results; + + internal GetPublicFolderEmailAddressesCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + base(exception, cancelled, userState) { + this.results = results; + } + + /// + public ExchangeEmailAddress[] Result { + get { + this.RaiseExceptionIfNecessary(); + return ((ExchangeEmailAddress[])(this.results[0])); + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + public delegate void AddPublicFolderEmailAddressCompletedEventHandler(object sender, AddPublicFolderEmailAddressCompletedEventArgs e); + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + public partial class AddPublicFolderEmailAddressCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { + + private object[] results; + + internal AddPublicFolderEmailAddressCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + base(exception, cancelled, userState) { + this.results = results; + } + + /// + public int Result { + get { + this.RaiseExceptionIfNecessary(); + return ((int)(this.results[0])); + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + public delegate void SetPublicFolderPrimaryEmailAddressCompletedEventHandler(object sender, SetPublicFolderPrimaryEmailAddressCompletedEventArgs e); + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + public partial class SetPublicFolderPrimaryEmailAddressCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { + + private object[] results; + + internal SetPublicFolderPrimaryEmailAddressCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + base(exception, cancelled, userState) { + this.results = results; + } + + /// + public int Result { + get { + this.RaiseExceptionIfNecessary(); + return ((int)(this.results[0])); + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + public delegate void DeletePublicFolderEmailAddressesCompletedEventHandler(object sender, DeletePublicFolderEmailAddressesCompletedEventArgs e); + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + public partial class DeletePublicFolderEmailAddressesCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { + + private object[] results; + + internal DeletePublicFolderEmailAddressesCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + base(exception, cancelled, userState) { + this.results = results; + } + + /// + public int Result { + get { + this.RaiseExceptionIfNecessary(); + return ((int)(this.results[0])); + } + } + } } diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Client/OrganizationProxy.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Client/OrganizationProxy.cs index a178d57c..f7164f03 100644 --- a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Client/OrganizationProxy.cs +++ b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Client/OrganizationProxy.cs @@ -1,35 +1,7 @@ -// Copyright (c) 2012, Outercurve Foundation. -// All rights reserved. -// -// Redistribution and use in source and binary forms, with or without modification, -// are permitted provided that the following conditions are met: -// -// - Redistributions of source code must retain the above copyright notice, this -// list of conditions and the following disclaimer. -// -// - Redistributions in binary form must reproduce the above copyright notice, -// this list of conditions and the following disclaimer in the documentation -// and/or other materials provided with the distribution. -// -// - Neither the name of the Outercurve Foundation nor the names of its -// contributors may be used to endorse or promote products derived from this -// software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR -// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON -// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - //------------------------------------------------------------------------------ // // This code was generated by a tool. -// Runtime Version:2.0.50727.3053 +// Runtime Version:2.0.50727.5456 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. @@ -39,162 +11,180 @@ // // This source code was auto-generated by wsdl, Version=2.0.50727.42. // -using WebsitePanel.Providers; -using WebsitePanel.Providers.Common; -using WebsitePanel.Providers.HostedSolution; -using WebsitePanel.Providers.ResultObjects; - -namespace WebsitePanel.EnterpriseServer.HostedSolution { - using System.Diagnostics; +namespace WebsitePanel.EnterpriseServer.HostedSolution +{ + using System.Xml.Serialization; using System.Web.Services; using System.ComponentModel; using System.Web.Services.Protocols; using System; - using System.Xml.Serialization; + using System.Diagnostics; using System.Data; - - + + using WebsitePanel.Providers; + using WebsitePanel.Providers.Common; + using WebsitePanel.Providers.HostedSolution; + using WebsitePanel.Providers.ResultObjects; + /// [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] [System.Diagnostics.DebuggerStepThroughAttribute()] [System.ComponentModel.DesignerCategoryAttribute("code")] - [System.Web.Services.WebServiceBindingAttribute(Name="esOrganizationsSoap", Namespace="http://tempuri.org/")] + [System.Web.Services.WebServiceBindingAttribute(Name = "esOrganizationsSoap", Namespace = "http://tempuri.org/")] [System.Xml.Serialization.XmlIncludeAttribute(typeof(ResultObject))] [System.Xml.Serialization.XmlIncludeAttribute(typeof(ServiceProviderItem))] - public partial class esOrganizations : Microsoft.Web.Services3.WebServicesClientProtocol { - + public partial class esOrganizations : Microsoft.Web.Services3.WebServicesClientProtocol + { + private System.Threading.SendOrPostCallback CreateOrganizationOperationCompleted; - + private System.Threading.SendOrPostCallback GetRawOrganizationsPagedOperationCompleted; - + private System.Threading.SendOrPostCallback GetOrganizationsOperationCompleted; - + private System.Threading.SendOrPostCallback GetOrganizationUserSummuryLetterOperationCompleted; - + private System.Threading.SendOrPostCallback SendOrganizationUserSummuryLetterOperationCompleted; - + private System.Threading.SendOrPostCallback DeleteOrganizationOperationCompleted; - + private System.Threading.SendOrPostCallback GetOrganizationStatisticsOperationCompleted; - + private System.Threading.SendOrPostCallback GetOrganizationOperationCompleted; - + + private System.Threading.SendOrPostCallback GetAccountIdByUserPrincipalNameOperationCompleted; + private System.Threading.SendOrPostCallback AddOrganizationDomainOperationCompleted; - + private System.Threading.SendOrPostCallback GetOrganizationDomainsOperationCompleted; - + private System.Threading.SendOrPostCallback DeleteOrganizationDomainOperationCompleted; - + private System.Threading.SendOrPostCallback SetOrganizationDefaultDomainOperationCompleted; - + private System.Threading.SendOrPostCallback CreateUserOperationCompleted; - + + private System.Threading.SendOrPostCallback ImportUserOperationCompleted; + private System.Threading.SendOrPostCallback GetOrganizationUsersPagedOperationCompleted; - + private System.Threading.SendOrPostCallback GetUserGeneralSettingsOperationCompleted; - + private System.Threading.SendOrPostCallback SetUserGeneralSettingsOperationCompleted; - + private System.Threading.SendOrPostCallback SearchAccountsOperationCompleted; - + private System.Threading.SendOrPostCallback DeleteUserOperationCompleted; - + private System.Threading.SendOrPostCallback GetPasswordPolicyOperationCompleted; - + /// - public esOrganizations() { - this.Url = "http://localhost/WebsitePanelEnterpriseServer/esOrganizations.asmx"; + public esOrganizations() + { + this.Url = "http://localhost:9002/esOrganizations.asmx"; } - + /// public event CreateOrganizationCompletedEventHandler CreateOrganizationCompleted; - + /// public event GetRawOrganizationsPagedCompletedEventHandler GetRawOrganizationsPagedCompleted; - + /// public event GetOrganizationsCompletedEventHandler GetOrganizationsCompleted; - + /// public event GetOrganizationUserSummuryLetterCompletedEventHandler GetOrganizationUserSummuryLetterCompleted; - + /// public event SendOrganizationUserSummuryLetterCompletedEventHandler SendOrganizationUserSummuryLetterCompleted; - + /// public event DeleteOrganizationCompletedEventHandler DeleteOrganizationCompleted; - + /// public event GetOrganizationStatisticsCompletedEventHandler GetOrganizationStatisticsCompleted; - + /// public event GetOrganizationCompletedEventHandler GetOrganizationCompleted; - + + /// + public event GetAccountIdByUserPrincipalNameCompletedEventHandler GetAccountIdByUserPrincipalNameCompleted; + /// public event AddOrganizationDomainCompletedEventHandler AddOrganizationDomainCompleted; - + /// public event GetOrganizationDomainsCompletedEventHandler GetOrganizationDomainsCompleted; - + /// public event DeleteOrganizationDomainCompletedEventHandler DeleteOrganizationDomainCompleted; - + /// public event SetOrganizationDefaultDomainCompletedEventHandler SetOrganizationDefaultDomainCompleted; - + /// public event CreateUserCompletedEventHandler CreateUserCompleted; - + + /// + public event ImportUserCompletedEventHandler ImportUserCompleted; + /// public event GetOrganizationUsersPagedCompletedEventHandler GetOrganizationUsersPagedCompleted; - + /// public event GetUserGeneralSettingsCompletedEventHandler GetUserGeneralSettingsCompleted; - + /// public event SetUserGeneralSettingsCompletedEventHandler SetUserGeneralSettingsCompleted; - + /// public event SearchAccountsCompletedEventHandler SearchAccountsCompleted; - + /// public event DeleteUserCompletedEventHandler DeleteUserCompleted; - + /// public event GetPasswordPolicyCompletedEventHandler GetPasswordPolicyCompleted; - + /// - [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://tempuri.org/CreateOrganization", RequestNamespace="http://tempuri.org/", ResponseNamespace="http://tempuri.org/", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] - public int CreateOrganization(int packageId, string organizationID, string organizationName) { + [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://tempuri.org/CreateOrganization", RequestNamespace = "http://tempuri.org/", ResponseNamespace = "http://tempuri.org/", Use = System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle = System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] + public int CreateOrganization(int packageId, string organizationID, string organizationName) + { object[] results = this.Invoke("CreateOrganization", new object[] { packageId, organizationID, organizationName}); return ((int)(results[0])); } - + /// - public System.IAsyncResult BeginCreateOrganization(int packageId, string organizationID, string organizationName, System.AsyncCallback callback, object asyncState) { + public System.IAsyncResult BeginCreateOrganization(int packageId, string organizationID, string organizationName, System.AsyncCallback callback, object asyncState) + { return this.BeginInvoke("CreateOrganization", new object[] { packageId, organizationID, organizationName}, callback, asyncState); } - + /// - public int EndCreateOrganization(System.IAsyncResult asyncResult) { + public int EndCreateOrganization(System.IAsyncResult asyncResult) + { object[] results = this.EndInvoke(asyncResult); return ((int)(results[0])); } - + /// - public void CreateOrganizationAsync(int packageId, string organizationID, string organizationName) { + public void CreateOrganizationAsync(int packageId, string organizationID, string organizationName) + { this.CreateOrganizationAsync(packageId, organizationID, organizationName, null); } - + /// - public void CreateOrganizationAsync(int packageId, string organizationID, string organizationName, object userState) { - if ((this.CreateOrganizationOperationCompleted == null)) { + public void CreateOrganizationAsync(int packageId, string organizationID, string organizationName, object userState) + { + if ((this.CreateOrganizationOperationCompleted == null)) + { this.CreateOrganizationOperationCompleted = new System.Threading.SendOrPostCallback(this.OnCreateOrganizationOperationCompleted); } this.InvokeAsync("CreateOrganization", new object[] { @@ -202,17 +192,20 @@ namespace WebsitePanel.EnterpriseServer.HostedSolution { organizationID, organizationName}, this.CreateOrganizationOperationCompleted, userState); } - - private void OnCreateOrganizationOperationCompleted(object arg) { - if ((this.CreateOrganizationCompleted != null)) { + + private void OnCreateOrganizationOperationCompleted(object arg) + { + if ((this.CreateOrganizationCompleted != null)) + { System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); this.CreateOrganizationCompleted(this, new CreateOrganizationCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); } } - + /// - [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://tempuri.org/GetRawOrganizationsPaged", RequestNamespace="http://tempuri.org/", ResponseNamespace="http://tempuri.org/", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] - public System.Data.DataSet GetRawOrganizationsPaged(int packageId, bool recursive, string filterColumn, string filterValue, string sortColumn, int startRow, int maximumRows) { + [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://tempuri.org/GetRawOrganizationsPaged", RequestNamespace = "http://tempuri.org/", ResponseNamespace = "http://tempuri.org/", Use = System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle = System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] + public System.Data.DataSet GetRawOrganizationsPaged(int packageId, bool recursive, string filterColumn, string filterValue, string sortColumn, int startRow, int maximumRows) + { object[] results = this.Invoke("GetRawOrganizationsPaged", new object[] { packageId, recursive, @@ -223,9 +216,10 @@ namespace WebsitePanel.EnterpriseServer.HostedSolution { maximumRows}); return ((System.Data.DataSet)(results[0])); } - + /// - public System.IAsyncResult BeginGetRawOrganizationsPaged(int packageId, bool recursive, string filterColumn, string filterValue, string sortColumn, int startRow, int maximumRows, System.AsyncCallback callback, object asyncState) { + public System.IAsyncResult BeginGetRawOrganizationsPaged(int packageId, bool recursive, string filterColumn, string filterValue, string sortColumn, int startRow, int maximumRows, System.AsyncCallback callback, object asyncState) + { return this.BeginInvoke("GetRawOrganizationsPaged", new object[] { packageId, recursive, @@ -235,21 +229,25 @@ namespace WebsitePanel.EnterpriseServer.HostedSolution { startRow, maximumRows}, callback, asyncState); } - + /// - public System.Data.DataSet EndGetRawOrganizationsPaged(System.IAsyncResult asyncResult) { + public System.Data.DataSet EndGetRawOrganizationsPaged(System.IAsyncResult asyncResult) + { object[] results = this.EndInvoke(asyncResult); return ((System.Data.DataSet)(results[0])); } - + /// - public void GetRawOrganizationsPagedAsync(int packageId, bool recursive, string filterColumn, string filterValue, string sortColumn, int startRow, int maximumRows) { + public void GetRawOrganizationsPagedAsync(int packageId, bool recursive, string filterColumn, string filterValue, string sortColumn, int startRow, int maximumRows) + { this.GetRawOrganizationsPagedAsync(packageId, recursive, filterColumn, filterValue, sortColumn, startRow, maximumRows, null); } - + /// - public void GetRawOrganizationsPagedAsync(int packageId, bool recursive, string filterColumn, string filterValue, string sortColumn, int startRow, int maximumRows, object userState) { - if ((this.GetRawOrganizationsPagedOperationCompleted == null)) { + public void GetRawOrganizationsPagedAsync(int packageId, bool recursive, string filterColumn, string filterValue, string sortColumn, int startRow, int maximumRows, object userState) + { + if ((this.GetRawOrganizationsPagedOperationCompleted == null)) + { this.GetRawOrganizationsPagedOperationCompleted = new System.Threading.SendOrPostCallback(this.OnGetRawOrganizationsPagedOperationCompleted); } this.InvokeAsync("GetRawOrganizationsPaged", new object[] { @@ -261,61 +259,72 @@ namespace WebsitePanel.EnterpriseServer.HostedSolution { startRow, maximumRows}, this.GetRawOrganizationsPagedOperationCompleted, userState); } - - private void OnGetRawOrganizationsPagedOperationCompleted(object arg) { - if ((this.GetRawOrganizationsPagedCompleted != null)) { + + private void OnGetRawOrganizationsPagedOperationCompleted(object arg) + { + if ((this.GetRawOrganizationsPagedCompleted != null)) + { System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); this.GetRawOrganizationsPagedCompleted(this, new GetRawOrganizationsPagedCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); } } - + /// - [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://tempuri.org/GetOrganizations", RequestNamespace="http://tempuri.org/", ResponseNamespace="http://tempuri.org/", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] - public Organization[] GetOrganizations(int packageId, bool recursive) { + [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://tempuri.org/GetOrganizations", RequestNamespace = "http://tempuri.org/", ResponseNamespace = "http://tempuri.org/", Use = System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle = System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] + public Organization[] GetOrganizations(int packageId, bool recursive) + { object[] results = this.Invoke("GetOrganizations", new object[] { packageId, recursive}); return ((Organization[])(results[0])); } - + /// - public System.IAsyncResult BeginGetOrganizations(int packageId, bool recursive, System.AsyncCallback callback, object asyncState) { + public System.IAsyncResult BeginGetOrganizations(int packageId, bool recursive, System.AsyncCallback callback, object asyncState) + { return this.BeginInvoke("GetOrganizations", new object[] { packageId, recursive}, callback, asyncState); } - + /// - public Organization[] EndGetOrganizations(System.IAsyncResult asyncResult) { + public Organization[] EndGetOrganizations(System.IAsyncResult asyncResult) + { object[] results = this.EndInvoke(asyncResult); return ((Organization[])(results[0])); } - + /// - public void GetOrganizationsAsync(int packageId, bool recursive) { + public void GetOrganizationsAsync(int packageId, bool recursive) + { this.GetOrganizationsAsync(packageId, recursive, null); } - + /// - public void GetOrganizationsAsync(int packageId, bool recursive, object userState) { - if ((this.GetOrganizationsOperationCompleted == null)) { + public void GetOrganizationsAsync(int packageId, bool recursive, object userState) + { + if ((this.GetOrganizationsOperationCompleted == null)) + { this.GetOrganizationsOperationCompleted = new System.Threading.SendOrPostCallback(this.OnGetOrganizationsOperationCompleted); } this.InvokeAsync("GetOrganizations", new object[] { packageId, recursive}, this.GetOrganizationsOperationCompleted, userState); } - - private void OnGetOrganizationsOperationCompleted(object arg) { - if ((this.GetOrganizationsCompleted != null)) { + + private void OnGetOrganizationsOperationCompleted(object arg) + { + if ((this.GetOrganizationsCompleted != null)) + { System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); this.GetOrganizationsCompleted(this, new GetOrganizationsCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); } } - + /// - [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://tempuri.org/GetOrganizationUserSummuryLetter", RequestNamespace="http://tempuri.org/", ResponseNamespace="http://tempuri.org/", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] - public string GetOrganizationUserSummuryLetter(int itemId, int accountId, bool pmm, bool emailMode, bool signup) { + [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://tempuri.org/GetOrganizationUserSummuryLetter", RequestNamespace = "http://tempuri.org/", ResponseNamespace = "http://tempuri.org/", Use = System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle = System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] + public string GetOrganizationUserSummuryLetter(int itemId, int accountId, bool pmm, bool emailMode, bool signup) + { object[] results = this.Invoke("GetOrganizationUserSummuryLetter", new object[] { itemId, accountId, @@ -324,9 +333,10 @@ namespace WebsitePanel.EnterpriseServer.HostedSolution { signup}); return ((string)(results[0])); } - + /// - public System.IAsyncResult BeginGetOrganizationUserSummuryLetter(int itemId, int accountId, bool pmm, bool emailMode, bool signup, System.AsyncCallback callback, object asyncState) { + public System.IAsyncResult BeginGetOrganizationUserSummuryLetter(int itemId, int accountId, bool pmm, bool emailMode, bool signup, System.AsyncCallback callback, object asyncState) + { return this.BeginInvoke("GetOrganizationUserSummuryLetter", new object[] { itemId, accountId, @@ -334,21 +344,25 @@ namespace WebsitePanel.EnterpriseServer.HostedSolution { emailMode, signup}, callback, asyncState); } - + /// - public string EndGetOrganizationUserSummuryLetter(System.IAsyncResult asyncResult) { + public string EndGetOrganizationUserSummuryLetter(System.IAsyncResult asyncResult) + { object[] results = this.EndInvoke(asyncResult); return ((string)(results[0])); } - + /// - public void GetOrganizationUserSummuryLetterAsync(int itemId, int accountId, bool pmm, bool emailMode, bool signup) { + public void GetOrganizationUserSummuryLetterAsync(int itemId, int accountId, bool pmm, bool emailMode, bool signup) + { this.GetOrganizationUserSummuryLetterAsync(itemId, accountId, pmm, emailMode, signup, null); } - + /// - public void GetOrganizationUserSummuryLetterAsync(int itemId, int accountId, bool pmm, bool emailMode, bool signup, object userState) { - if ((this.GetOrganizationUserSummuryLetterOperationCompleted == null)) { + public void GetOrganizationUserSummuryLetterAsync(int itemId, int accountId, bool pmm, bool emailMode, bool signup, object userState) + { + if ((this.GetOrganizationUserSummuryLetterOperationCompleted == null)) + { this.GetOrganizationUserSummuryLetterOperationCompleted = new System.Threading.SendOrPostCallback(this.OnGetOrganizationUserSummuryLetterOperationCompleted); } this.InvokeAsync("GetOrganizationUserSummuryLetter", new object[] { @@ -358,17 +372,20 @@ namespace WebsitePanel.EnterpriseServer.HostedSolution { emailMode, signup}, this.GetOrganizationUserSummuryLetterOperationCompleted, userState); } - - private void OnGetOrganizationUserSummuryLetterOperationCompleted(object arg) { - if ((this.GetOrganizationUserSummuryLetterCompleted != null)) { + + private void OnGetOrganizationUserSummuryLetterOperationCompleted(object arg) + { + if ((this.GetOrganizationUserSummuryLetterCompleted != null)) + { System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); this.GetOrganizationUserSummuryLetterCompleted(this, new GetOrganizationUserSummuryLetterCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); } } - + /// - [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://tempuri.org/SendOrganizationUserSummuryLetter", RequestNamespace="http://tempuri.org/", ResponseNamespace="http://tempuri.org/", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] - public int SendOrganizationUserSummuryLetter(int itemId, int accountId, bool signup, string to, string cc) { + [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://tempuri.org/SendOrganizationUserSummuryLetter", RequestNamespace = "http://tempuri.org/", ResponseNamespace = "http://tempuri.org/", Use = System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle = System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] + public int SendOrganizationUserSummuryLetter(int itemId, int accountId, bool signup, string to, string cc) + { object[] results = this.Invoke("SendOrganizationUserSummuryLetter", new object[] { itemId, accountId, @@ -377,9 +394,10 @@ namespace WebsitePanel.EnterpriseServer.HostedSolution { cc}); return ((int)(results[0])); } - + /// - public System.IAsyncResult BeginSendOrganizationUserSummuryLetter(int itemId, int accountId, bool signup, string to, string cc, System.AsyncCallback callback, object asyncState) { + public System.IAsyncResult BeginSendOrganizationUserSummuryLetter(int itemId, int accountId, bool signup, string to, string cc, System.AsyncCallback callback, object asyncState) + { return this.BeginInvoke("SendOrganizationUserSummuryLetter", new object[] { itemId, accountId, @@ -387,21 +405,25 @@ namespace WebsitePanel.EnterpriseServer.HostedSolution { to, cc}, callback, asyncState); } - + /// - public int EndSendOrganizationUserSummuryLetter(System.IAsyncResult asyncResult) { + public int EndSendOrganizationUserSummuryLetter(System.IAsyncResult asyncResult) + { object[] results = this.EndInvoke(asyncResult); return ((int)(results[0])); } - + /// - public void SendOrganizationUserSummuryLetterAsync(int itemId, int accountId, bool signup, string to, string cc) { + public void SendOrganizationUserSummuryLetterAsync(int itemId, int accountId, bool signup, string to, string cc) + { this.SendOrganizationUserSummuryLetterAsync(itemId, accountId, signup, to, cc, null); } - + /// - public void SendOrganizationUserSummuryLetterAsync(int itemId, int accountId, bool signup, string to, string cc, object userState) { - if ((this.SendOrganizationUserSummuryLetterOperationCompleted == null)) { + public void SendOrganizationUserSummuryLetterAsync(int itemId, int accountId, bool signup, string to, string cc, object userState) + { + if ((this.SendOrganizationUserSummuryLetterOperationCompleted == null)) + { this.SendOrganizationUserSummuryLetterOperationCompleted = new System.Threading.SendOrPostCallback(this.OnSendOrganizationUserSummuryLetterOperationCompleted); } this.InvokeAsync("SendOrganizationUserSummuryLetter", new object[] { @@ -411,350 +433,468 @@ namespace WebsitePanel.EnterpriseServer.HostedSolution { to, cc}, this.SendOrganizationUserSummuryLetterOperationCompleted, userState); } - - private void OnSendOrganizationUserSummuryLetterOperationCompleted(object arg) { - if ((this.SendOrganizationUserSummuryLetterCompleted != null)) { + + private void OnSendOrganizationUserSummuryLetterOperationCompleted(object arg) + { + if ((this.SendOrganizationUserSummuryLetterCompleted != null)) + { System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); this.SendOrganizationUserSummuryLetterCompleted(this, new SendOrganizationUserSummuryLetterCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); } } - + /// - [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://tempuri.org/DeleteOrganization", RequestNamespace="http://tempuri.org/", ResponseNamespace="http://tempuri.org/", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] - public int DeleteOrganization(int itemId) { + [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://tempuri.org/DeleteOrganization", RequestNamespace = "http://tempuri.org/", ResponseNamespace = "http://tempuri.org/", Use = System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle = System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] + public int DeleteOrganization(int itemId) + { object[] results = this.Invoke("DeleteOrganization", new object[] { itemId}); return ((int)(results[0])); } - + /// - public System.IAsyncResult BeginDeleteOrganization(int itemId, System.AsyncCallback callback, object asyncState) { + public System.IAsyncResult BeginDeleteOrganization(int itemId, System.AsyncCallback callback, object asyncState) + { return this.BeginInvoke("DeleteOrganization", new object[] { itemId}, callback, asyncState); } - + /// - public int EndDeleteOrganization(System.IAsyncResult asyncResult) { + public int EndDeleteOrganization(System.IAsyncResult asyncResult) + { object[] results = this.EndInvoke(asyncResult); return ((int)(results[0])); } - + /// - public void DeleteOrganizationAsync(int itemId) { + public void DeleteOrganizationAsync(int itemId) + { this.DeleteOrganizationAsync(itemId, null); } - + /// - public void DeleteOrganizationAsync(int itemId, object userState) { - if ((this.DeleteOrganizationOperationCompleted == null)) { + public void DeleteOrganizationAsync(int itemId, object userState) + { + if ((this.DeleteOrganizationOperationCompleted == null)) + { this.DeleteOrganizationOperationCompleted = new System.Threading.SendOrPostCallback(this.OnDeleteOrganizationOperationCompleted); } this.InvokeAsync("DeleteOrganization", new object[] { itemId}, this.DeleteOrganizationOperationCompleted, userState); } - - private void OnDeleteOrganizationOperationCompleted(object arg) { - if ((this.DeleteOrganizationCompleted != null)) { + + private void OnDeleteOrganizationOperationCompleted(object arg) + { + if ((this.DeleteOrganizationCompleted != null)) + { System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); this.DeleteOrganizationCompleted(this, new DeleteOrganizationCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); } } - + /// - [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://tempuri.org/GetOrganizationStatistics", RequestNamespace="http://tempuri.org/", ResponseNamespace="http://tempuri.org/", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] - public OrganizationStatistics GetOrganizationStatistics(int itemId) { + [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://tempuri.org/GetOrganizationStatistics", RequestNamespace = "http://tempuri.org/", ResponseNamespace = "http://tempuri.org/", Use = System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle = System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] + public OrganizationStatistics GetOrganizationStatistics(int itemId) + { object[] results = this.Invoke("GetOrganizationStatistics", new object[] { itemId}); return ((OrganizationStatistics)(results[0])); } - + /// - public System.IAsyncResult BeginGetOrganizationStatistics(int itemId, System.AsyncCallback callback, object asyncState) { + public System.IAsyncResult BeginGetOrganizationStatistics(int itemId, System.AsyncCallback callback, object asyncState) + { return this.BeginInvoke("GetOrganizationStatistics", new object[] { itemId}, callback, asyncState); } - + /// - public OrganizationStatistics EndGetOrganizationStatistics(System.IAsyncResult asyncResult) { + public OrganizationStatistics EndGetOrganizationStatistics(System.IAsyncResult asyncResult) + { object[] results = this.EndInvoke(asyncResult); return ((OrganizationStatistics)(results[0])); } - + /// - public void GetOrganizationStatisticsAsync(int itemId) { + public void GetOrganizationStatisticsAsync(int itemId) + { this.GetOrganizationStatisticsAsync(itemId, null); } - + /// - public void GetOrganizationStatisticsAsync(int itemId, object userState) { - if ((this.GetOrganizationStatisticsOperationCompleted == null)) { + public void GetOrganizationStatisticsAsync(int itemId, object userState) + { + if ((this.GetOrganizationStatisticsOperationCompleted == null)) + { this.GetOrganizationStatisticsOperationCompleted = new System.Threading.SendOrPostCallback(this.OnGetOrganizationStatisticsOperationCompleted); } this.InvokeAsync("GetOrganizationStatistics", new object[] { itemId}, this.GetOrganizationStatisticsOperationCompleted, userState); } - - private void OnGetOrganizationStatisticsOperationCompleted(object arg) { - if ((this.GetOrganizationStatisticsCompleted != null)) { + + private void OnGetOrganizationStatisticsOperationCompleted(object arg) + { + if ((this.GetOrganizationStatisticsCompleted != null)) + { System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); this.GetOrganizationStatisticsCompleted(this, new GetOrganizationStatisticsCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); } } - + /// - [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://tempuri.org/GetOrganization", RequestNamespace="http://tempuri.org/", ResponseNamespace="http://tempuri.org/", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] - public Organization GetOrganization(int itemId) { + [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://tempuri.org/GetOrganization", RequestNamespace = "http://tempuri.org/", ResponseNamespace = "http://tempuri.org/", Use = System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle = System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] + public Organization GetOrganization(int itemId) + { object[] results = this.Invoke("GetOrganization", new object[] { itemId}); return ((Organization)(results[0])); } - + /// - public System.IAsyncResult BeginGetOrganization(int itemId, System.AsyncCallback callback, object asyncState) { + public System.IAsyncResult BeginGetOrganization(int itemId, System.AsyncCallback callback, object asyncState) + { return this.BeginInvoke("GetOrganization", new object[] { itemId}, callback, asyncState); } - + /// - public Organization EndGetOrganization(System.IAsyncResult asyncResult) { + public Organization EndGetOrganization(System.IAsyncResult asyncResult) + { object[] results = this.EndInvoke(asyncResult); return ((Organization)(results[0])); } - + /// - public void GetOrganizationAsync(int itemId) { + public void GetOrganizationAsync(int itemId) + { this.GetOrganizationAsync(itemId, null); } - + /// - public void GetOrganizationAsync(int itemId, object userState) { - if ((this.GetOrganizationOperationCompleted == null)) { + public void GetOrganizationAsync(int itemId, object userState) + { + if ((this.GetOrganizationOperationCompleted == null)) + { this.GetOrganizationOperationCompleted = new System.Threading.SendOrPostCallback(this.OnGetOrganizationOperationCompleted); } this.InvokeAsync("GetOrganization", new object[] { itemId}, this.GetOrganizationOperationCompleted, userState); } - - private void OnGetOrganizationOperationCompleted(object arg) { - if ((this.GetOrganizationCompleted != null)) { + + private void OnGetOrganizationOperationCompleted(object arg) + { + if ((this.GetOrganizationCompleted != null)) + { System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); this.GetOrganizationCompleted(this, new GetOrganizationCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); } } - + /// - [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://tempuri.org/AddOrganizationDomain", RequestNamespace="http://tempuri.org/", ResponseNamespace="http://tempuri.org/", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] - public int AddOrganizationDomain(int itemId, string domainName) { + [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://tempuri.org/GetAccountIdByUserPrincipalName", RequestNamespace = "http://tempuri.org/", ResponseNamespace = "http://tempuri.org/", Use = System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle = System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] + public int GetAccountIdByUserPrincipalName(int itemId, string userPrincipalName) + { + object[] results = this.Invoke("GetAccountIdByUserPrincipalName", new object[] { + itemId, + userPrincipalName}); + return ((int)(results[0])); + } + + /// + public System.IAsyncResult BeginGetAccountIdByUserPrincipalName(int itemId, string userPrincipalName, System.AsyncCallback callback, object asyncState) + { + return this.BeginInvoke("GetAccountIdByUserPrincipalName", new object[] { + itemId, + userPrincipalName}, callback, asyncState); + } + + /// + public int EndGetAccountIdByUserPrincipalName(System.IAsyncResult asyncResult) + { + object[] results = this.EndInvoke(asyncResult); + return ((int)(results[0])); + } + + /// + public void GetAccountIdByUserPrincipalNameAsync(int itemId, string userPrincipalName) + { + this.GetAccountIdByUserPrincipalNameAsync(itemId, userPrincipalName, null); + } + + /// + public void GetAccountIdByUserPrincipalNameAsync(int itemId, string userPrincipalName, object userState) + { + if ((this.GetAccountIdByUserPrincipalNameOperationCompleted == null)) + { + this.GetAccountIdByUserPrincipalNameOperationCompleted = new System.Threading.SendOrPostCallback(this.OnGetAccountIdByUserPrincipalNameOperationCompleted); + } + this.InvokeAsync("GetAccountIdByUserPrincipalName", new object[] { + itemId, + userPrincipalName}, this.GetAccountIdByUserPrincipalNameOperationCompleted, userState); + } + + private void OnGetAccountIdByUserPrincipalNameOperationCompleted(object arg) + { + if ((this.GetAccountIdByUserPrincipalNameCompleted != null)) + { + System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); + this.GetAccountIdByUserPrincipalNameCompleted(this, new GetAccountIdByUserPrincipalNameCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); + } + } + + /// + [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://tempuri.org/AddOrganizationDomain", RequestNamespace = "http://tempuri.org/", ResponseNamespace = "http://tempuri.org/", Use = System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle = System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] + public int AddOrganizationDomain(int itemId, string domainName) + { object[] results = this.Invoke("AddOrganizationDomain", new object[] { itemId, domainName}); return ((int)(results[0])); } - + /// - public System.IAsyncResult BeginAddOrganizationDomain(int itemId, string domainName, System.AsyncCallback callback, object asyncState) { + public System.IAsyncResult BeginAddOrganizationDomain(int itemId, string domainName, System.AsyncCallback callback, object asyncState) + { return this.BeginInvoke("AddOrganizationDomain", new object[] { itemId, domainName}, callback, asyncState); } - + /// - public int EndAddOrganizationDomain(System.IAsyncResult asyncResult) { + public int EndAddOrganizationDomain(System.IAsyncResult asyncResult) + { object[] results = this.EndInvoke(asyncResult); return ((int)(results[0])); } - + /// - public void AddOrganizationDomainAsync(int itemId, string domainName) { + public void AddOrganizationDomainAsync(int itemId, string domainName) + { this.AddOrganizationDomainAsync(itemId, domainName, null); } - + /// - public void AddOrganizationDomainAsync(int itemId, string domainName, object userState) { - if ((this.AddOrganizationDomainOperationCompleted == null)) { + public void AddOrganizationDomainAsync(int itemId, string domainName, object userState) + { + if ((this.AddOrganizationDomainOperationCompleted == null)) + { this.AddOrganizationDomainOperationCompleted = new System.Threading.SendOrPostCallback(this.OnAddOrganizationDomainOperationCompleted); } this.InvokeAsync("AddOrganizationDomain", new object[] { itemId, domainName}, this.AddOrganizationDomainOperationCompleted, userState); } - - private void OnAddOrganizationDomainOperationCompleted(object arg) { - if ((this.AddOrganizationDomainCompleted != null)) { + + private void OnAddOrganizationDomainOperationCompleted(object arg) + { + if ((this.AddOrganizationDomainCompleted != null)) + { System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); this.AddOrganizationDomainCompleted(this, new AddOrganizationDomainCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); } } - + /// - [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://tempuri.org/GetOrganizationDomains", RequestNamespace="http://tempuri.org/", ResponseNamespace="http://tempuri.org/", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] - public OrganizationDomainName[] GetOrganizationDomains(int itemId) { + [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://tempuri.org/GetOrganizationDomains", RequestNamespace = "http://tempuri.org/", ResponseNamespace = "http://tempuri.org/", Use = System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle = System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] + public OrganizationDomainName[] GetOrganizationDomains(int itemId) + { object[] results = this.Invoke("GetOrganizationDomains", new object[] { itemId}); return ((OrganizationDomainName[])(results[0])); } - + /// - public System.IAsyncResult BeginGetOrganizationDomains(int itemId, System.AsyncCallback callback, object asyncState) { + public System.IAsyncResult BeginGetOrganizationDomains(int itemId, System.AsyncCallback callback, object asyncState) + { return this.BeginInvoke("GetOrganizationDomains", new object[] { itemId}, callback, asyncState); } - + /// - public OrganizationDomainName[] EndGetOrganizationDomains(System.IAsyncResult asyncResult) { + public OrganizationDomainName[] EndGetOrganizationDomains(System.IAsyncResult asyncResult) + { object[] results = this.EndInvoke(asyncResult); return ((OrganizationDomainName[])(results[0])); } - + /// - public void GetOrganizationDomainsAsync(int itemId) { + public void GetOrganizationDomainsAsync(int itemId) + { this.GetOrganizationDomainsAsync(itemId, null); } - + /// - public void GetOrganizationDomainsAsync(int itemId, object userState) { - if ((this.GetOrganizationDomainsOperationCompleted == null)) { + public void GetOrganizationDomainsAsync(int itemId, object userState) + { + if ((this.GetOrganizationDomainsOperationCompleted == null)) + { this.GetOrganizationDomainsOperationCompleted = new System.Threading.SendOrPostCallback(this.OnGetOrganizationDomainsOperationCompleted); } this.InvokeAsync("GetOrganizationDomains", new object[] { itemId}, this.GetOrganizationDomainsOperationCompleted, userState); } - - private void OnGetOrganizationDomainsOperationCompleted(object arg) { - if ((this.GetOrganizationDomainsCompleted != null)) { + + private void OnGetOrganizationDomainsOperationCompleted(object arg) + { + if ((this.GetOrganizationDomainsCompleted != null)) + { System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); this.GetOrganizationDomainsCompleted(this, new GetOrganizationDomainsCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); } } - + /// - [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://tempuri.org/DeleteOrganizationDomain", RequestNamespace="http://tempuri.org/", ResponseNamespace="http://tempuri.org/", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] - public int DeleteOrganizationDomain(int itemId, int domainId) { + [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://tempuri.org/DeleteOrganizationDomain", RequestNamespace = "http://tempuri.org/", ResponseNamespace = "http://tempuri.org/", Use = System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle = System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] + public int DeleteOrganizationDomain(int itemId, int domainId) + { object[] results = this.Invoke("DeleteOrganizationDomain", new object[] { itemId, domainId}); return ((int)(results[0])); } - + /// - public System.IAsyncResult BeginDeleteOrganizationDomain(int itemId, int domainId, System.AsyncCallback callback, object asyncState) { + public System.IAsyncResult BeginDeleteOrganizationDomain(int itemId, int domainId, System.AsyncCallback callback, object asyncState) + { return this.BeginInvoke("DeleteOrganizationDomain", new object[] { itemId, domainId}, callback, asyncState); } - + /// - public int EndDeleteOrganizationDomain(System.IAsyncResult asyncResult) { + public int EndDeleteOrganizationDomain(System.IAsyncResult asyncResult) + { object[] results = this.EndInvoke(asyncResult); return ((int)(results[0])); } - + /// - public void DeleteOrganizationDomainAsync(int itemId, int domainId) { + public void DeleteOrganizationDomainAsync(int itemId, int domainId) + { this.DeleteOrganizationDomainAsync(itemId, domainId, null); } - + /// - public void DeleteOrganizationDomainAsync(int itemId, int domainId, object userState) { - if ((this.DeleteOrganizationDomainOperationCompleted == null)) { + public void DeleteOrganizationDomainAsync(int itemId, int domainId, object userState) + { + if ((this.DeleteOrganizationDomainOperationCompleted == null)) + { this.DeleteOrganizationDomainOperationCompleted = new System.Threading.SendOrPostCallback(this.OnDeleteOrganizationDomainOperationCompleted); } this.InvokeAsync("DeleteOrganizationDomain", new object[] { itemId, domainId}, this.DeleteOrganizationDomainOperationCompleted, userState); } - - private void OnDeleteOrganizationDomainOperationCompleted(object arg) { - if ((this.DeleteOrganizationDomainCompleted != null)) { + + private void OnDeleteOrganizationDomainOperationCompleted(object arg) + { + if ((this.DeleteOrganizationDomainCompleted != null)) + { System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); this.DeleteOrganizationDomainCompleted(this, new DeleteOrganizationDomainCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); } } - + /// - [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://tempuri.org/SetOrganizationDefaultDomain", RequestNamespace="http://tempuri.org/", ResponseNamespace="http://tempuri.org/", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] - public int SetOrganizationDefaultDomain(int itemId, int domainId) { + [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://tempuri.org/SetOrganizationDefaultDomain", RequestNamespace = "http://tempuri.org/", ResponseNamespace = "http://tempuri.org/", Use = System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle = System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] + public int SetOrganizationDefaultDomain(int itemId, int domainId) + { object[] results = this.Invoke("SetOrganizationDefaultDomain", new object[] { itemId, domainId}); return ((int)(results[0])); } - + /// - public System.IAsyncResult BeginSetOrganizationDefaultDomain(int itemId, int domainId, System.AsyncCallback callback, object asyncState) { + public System.IAsyncResult BeginSetOrganizationDefaultDomain(int itemId, int domainId, System.AsyncCallback callback, object asyncState) + { return this.BeginInvoke("SetOrganizationDefaultDomain", new object[] { itemId, domainId}, callback, asyncState); } - + /// - public int EndSetOrganizationDefaultDomain(System.IAsyncResult asyncResult) { + public int EndSetOrganizationDefaultDomain(System.IAsyncResult asyncResult) + { object[] results = this.EndInvoke(asyncResult); return ((int)(results[0])); } - + /// - public void SetOrganizationDefaultDomainAsync(int itemId, int domainId) { + public void SetOrganizationDefaultDomainAsync(int itemId, int domainId) + { this.SetOrganizationDefaultDomainAsync(itemId, domainId, null); } - + /// - public void SetOrganizationDefaultDomainAsync(int itemId, int domainId, object userState) { - if ((this.SetOrganizationDefaultDomainOperationCompleted == null)) { + public void SetOrganizationDefaultDomainAsync(int itemId, int domainId, object userState) + { + if ((this.SetOrganizationDefaultDomainOperationCompleted == null)) + { this.SetOrganizationDefaultDomainOperationCompleted = new System.Threading.SendOrPostCallback(this.OnSetOrganizationDefaultDomainOperationCompleted); } this.InvokeAsync("SetOrganizationDefaultDomain", new object[] { itemId, domainId}, this.SetOrganizationDefaultDomainOperationCompleted, userState); } - - private void OnSetOrganizationDefaultDomainOperationCompleted(object arg) { - if ((this.SetOrganizationDefaultDomainCompleted != null)) { + + private void OnSetOrganizationDefaultDomainOperationCompleted(object arg) + { + if ((this.SetOrganizationDefaultDomainCompleted != null)) + { System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); this.SetOrganizationDefaultDomainCompleted(this, new SetOrganizationDefaultDomainCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); } } - + /// - [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://tempuri.org/CreateUser", RequestNamespace="http://tempuri.org/", ResponseNamespace="http://tempuri.org/", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] - public int CreateUser(int itemId, string displayName, string name, string domain, string password, bool sendNotification, string to) { + [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://tempuri.org/CreateUser", RequestNamespace = "http://tempuri.org/", ResponseNamespace = "http://tempuri.org/", Use = System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle = System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] + public int CreateUser(int itemId, string displayName, string name, string domain, string password, string subscriberNumber, bool sendNotification, string to) + { object[] results = this.Invoke("CreateUser", new object[] { itemId, displayName, name, domain, password, + subscriberNumber, sendNotification, to}); return ((int)(results[0])); } - + /// - public System.IAsyncResult BeginCreateUser(int itemId, string displayName, string name, string domain, string password, bool sendNotification, string to, System.AsyncCallback callback, object asyncState) { + public System.IAsyncResult BeginCreateUser(int itemId, string displayName, string name, string domain, string password, string subscriberNumber, bool sendNotification, string to, System.AsyncCallback callback, object asyncState) + { return this.BeginInvoke("CreateUser", new object[] { itemId, displayName, name, domain, password, + subscriberNumber, sendNotification, to}, callback, asyncState); } - + /// - public int EndCreateUser(System.IAsyncResult asyncResult) { + public int EndCreateUser(System.IAsyncResult asyncResult) + { object[] results = this.EndInvoke(asyncResult); return ((int)(results[0])); } - + /// - public void CreateUserAsync(int itemId, string displayName, string name, string domain, string password, bool sendNotification, string to) { - this.CreateUserAsync(itemId, displayName, name, domain, password, sendNotification, to, null); + public void CreateUserAsync(int itemId, string displayName, string name, string domain, string password, string subscriberNumber, bool sendNotification, string to) + { + this.CreateUserAsync(itemId, displayName, name, domain, password, subscriberNumber, sendNotification, to, null); } - + /// - public void CreateUserAsync(int itemId, string displayName, string name, string domain, string password, bool sendNotification, string to, object userState) { - if ((this.CreateUserOperationCompleted == null)) { + public void CreateUserAsync(int itemId, string displayName, string name, string domain, string password, string subscriberNumber, bool sendNotification, string to, object userState) + { + if ((this.CreateUserOperationCompleted == null)) + { this.CreateUserOperationCompleted = new System.Threading.SendOrPostCallback(this.OnCreateUserOperationCompleted); } this.InvokeAsync("CreateUser", new object[] { @@ -763,20 +903,88 @@ namespace WebsitePanel.EnterpriseServer.HostedSolution { name, domain, password, + subscriberNumber, sendNotification, to}, this.CreateUserOperationCompleted, userState); } - - private void OnCreateUserOperationCompleted(object arg) { - if ((this.CreateUserCompleted != null)) { + + private void OnCreateUserOperationCompleted(object arg) + { + if ((this.CreateUserCompleted != null)) + { System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); this.CreateUserCompleted(this, new CreateUserCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); } } - + /// - [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://tempuri.org/GetOrganizationUsersPaged", RequestNamespace="http://tempuri.org/", ResponseNamespace="http://tempuri.org/", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] - public OrganizationUsersPaged GetOrganizationUsersPaged(int itemId, string filterColumn, string filterValue, string sortColumn, int startRow, int maximumRows) { + [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://tempuri.org/ImportUser", RequestNamespace = "http://tempuri.org/", ResponseNamespace = "http://tempuri.org/", Use = System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle = System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] + public int ImportUser(int itemId, string accountName, string displayName, string name, string domain, string password) + { + object[] results = this.Invoke("ImportUser", new object[] { + itemId, + accountName, + displayName, + name, + domain, + password}); + return ((int)(results[0])); + } + + /// + public System.IAsyncResult BeginImportUser(int itemId, string accountName, string displayName, string name, string domain, string password, System.AsyncCallback callback, object asyncState) + { + return this.BeginInvoke("ImportUser", new object[] { + itemId, + accountName, + displayName, + name, + domain, + password}, callback, asyncState); + } + + /// + public int EndImportUser(System.IAsyncResult asyncResult) + { + object[] results = this.EndInvoke(asyncResult); + return ((int)(results[0])); + } + + /// + public void ImportUserAsync(int itemId, string accountName, string displayName, string name, string domain, string password) + { + this.ImportUserAsync(itemId, accountName, displayName, name, domain, password, null); + } + + /// + public void ImportUserAsync(int itemId, string accountName, string displayName, string name, string domain, string password, object userState) + { + if ((this.ImportUserOperationCompleted == null)) + { + this.ImportUserOperationCompleted = new System.Threading.SendOrPostCallback(this.OnImportUserOperationCompleted); + } + this.InvokeAsync("ImportUser", new object[] { + itemId, + accountName, + displayName, + name, + domain, + password}, this.ImportUserOperationCompleted, userState); + } + + private void OnImportUserOperationCompleted(object arg) + { + if ((this.ImportUserCompleted != null)) + { + System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); + this.ImportUserCompleted(this, new ImportUserCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); + } + } + + /// + [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://tempuri.org/GetOrganizationUsersPaged", RequestNamespace = "http://tempuri.org/", ResponseNamespace = "http://tempuri.org/", Use = System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle = System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] + public OrganizationUsersPaged GetOrganizationUsersPaged(int itemId, string filterColumn, string filterValue, string sortColumn, int startRow, int maximumRows) + { object[] results = this.Invoke("GetOrganizationUsersPaged", new object[] { itemId, filterColumn, @@ -786,9 +994,10 @@ namespace WebsitePanel.EnterpriseServer.HostedSolution { maximumRows}); return ((OrganizationUsersPaged)(results[0])); } - + /// - public System.IAsyncResult BeginGetOrganizationUsersPaged(int itemId, string filterColumn, string filterValue, string sortColumn, int startRow, int maximumRows, System.AsyncCallback callback, object asyncState) { + public System.IAsyncResult BeginGetOrganizationUsersPaged(int itemId, string filterColumn, string filterValue, string sortColumn, int startRow, int maximumRows, System.AsyncCallback callback, object asyncState) + { return this.BeginInvoke("GetOrganizationUsersPaged", new object[] { itemId, filterColumn, @@ -797,21 +1006,25 @@ namespace WebsitePanel.EnterpriseServer.HostedSolution { startRow, maximumRows}, callback, asyncState); } - + /// - public OrganizationUsersPaged EndGetOrganizationUsersPaged(System.IAsyncResult asyncResult) { + public OrganizationUsersPaged EndGetOrganizationUsersPaged(System.IAsyncResult asyncResult) + { object[] results = this.EndInvoke(asyncResult); return ((OrganizationUsersPaged)(results[0])); } - + /// - public void GetOrganizationUsersPagedAsync(int itemId, string filterColumn, string filterValue, string sortColumn, int startRow, int maximumRows) { + public void GetOrganizationUsersPagedAsync(int itemId, string filterColumn, string filterValue, string sortColumn, int startRow, int maximumRows) + { this.GetOrganizationUsersPagedAsync(itemId, filterColumn, filterValue, sortColumn, startRow, maximumRows, null); } - + /// - public void GetOrganizationUsersPagedAsync(int itemId, string filterColumn, string filterValue, string sortColumn, int startRow, int maximumRows, object userState) { - if ((this.GetOrganizationUsersPagedOperationCompleted == null)) { + public void GetOrganizationUsersPagedAsync(int itemId, string filterColumn, string filterValue, string sortColumn, int startRow, int maximumRows, object userState) + { + if ((this.GetOrganizationUsersPagedOperationCompleted == null)) + { this.GetOrganizationUsersPagedOperationCompleted = new System.Threading.SendOrPostCallback(this.OnGetOrganizationUsersPagedOperationCompleted); } this.InvokeAsync("GetOrganizationUsersPaged", new object[] { @@ -822,89 +1035,101 @@ namespace WebsitePanel.EnterpriseServer.HostedSolution { startRow, maximumRows}, this.GetOrganizationUsersPagedOperationCompleted, userState); } - - private void OnGetOrganizationUsersPagedOperationCompleted(object arg) { - if ((this.GetOrganizationUsersPagedCompleted != null)) { + + private void OnGetOrganizationUsersPagedOperationCompleted(object arg) + { + if ((this.GetOrganizationUsersPagedCompleted != null)) + { System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); this.GetOrganizationUsersPagedCompleted(this, new GetOrganizationUsersPagedCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); } } - + /// - [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://tempuri.org/GetUserGeneralSettings", RequestNamespace="http://tempuri.org/", ResponseNamespace="http://tempuri.org/", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] - public OrganizationUser GetUserGeneralSettings(int itemId, int accountId) { + [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://tempuri.org/GetUserGeneralSettings", RequestNamespace = "http://tempuri.org/", ResponseNamespace = "http://tempuri.org/", Use = System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle = System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] + public OrganizationUser GetUserGeneralSettings(int itemId, int accountId) + { object[] results = this.Invoke("GetUserGeneralSettings", new object[] { itemId, accountId}); return ((OrganizationUser)(results[0])); } - + /// - public System.IAsyncResult BeginGetUserGeneralSettings(int itemId, int accountId, System.AsyncCallback callback, object asyncState) { + public System.IAsyncResult BeginGetUserGeneralSettings(int itemId, int accountId, System.AsyncCallback callback, object asyncState) + { return this.BeginInvoke("GetUserGeneralSettings", new object[] { itemId, accountId}, callback, asyncState); } - + /// - public OrganizationUser EndGetUserGeneralSettings(System.IAsyncResult asyncResult) { + public OrganizationUser EndGetUserGeneralSettings(System.IAsyncResult asyncResult) + { object[] results = this.EndInvoke(asyncResult); return ((OrganizationUser)(results[0])); } - + /// - public void GetUserGeneralSettingsAsync(int itemId, int accountId) { + public void GetUserGeneralSettingsAsync(int itemId, int accountId) + { this.GetUserGeneralSettingsAsync(itemId, accountId, null); } - + /// - public void GetUserGeneralSettingsAsync(int itemId, int accountId, object userState) { - if ((this.GetUserGeneralSettingsOperationCompleted == null)) { + public void GetUserGeneralSettingsAsync(int itemId, int accountId, object userState) + { + if ((this.GetUserGeneralSettingsOperationCompleted == null)) + { this.GetUserGeneralSettingsOperationCompleted = new System.Threading.SendOrPostCallback(this.OnGetUserGeneralSettingsOperationCompleted); } this.InvokeAsync("GetUserGeneralSettings", new object[] { itemId, accountId}, this.GetUserGeneralSettingsOperationCompleted, userState); } - - private void OnGetUserGeneralSettingsOperationCompleted(object arg) { - if ((this.GetUserGeneralSettingsCompleted != null)) { + + private void OnGetUserGeneralSettingsOperationCompleted(object arg) + { + if ((this.GetUserGeneralSettingsCompleted != null)) + { System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); this.GetUserGeneralSettingsCompleted(this, new GetUserGeneralSettingsCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); } } - + /// - [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://tempuri.org/SetUserGeneralSettings", RequestNamespace="http://tempuri.org/", ResponseNamespace="http://tempuri.org/", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] + [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://tempuri.org/SetUserGeneralSettings", RequestNamespace = "http://tempuri.org/", ResponseNamespace = "http://tempuri.org/", Use = System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle = System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] public int SetUserGeneralSettings( - int itemId, - int accountId, - string displayName, - string password, - bool hideAddressBook, - bool disabled, - bool locked, - string firstName, - string initials, - string lastName, - string address, - string city, - string state, - string zip, - string country, - string jobTitle, - string company, - string department, - string office, - string managerAccountName, - string businessPhone, - string fax, - string homePhone, - string mobilePhone, - string pager, - string webPage, - string notes, - string externalEmail) { + int itemId, + int accountId, + string displayName, + string password, + bool hideAddressBook, + bool disabled, + bool locked, + string firstName, + string initials, + string lastName, + string address, + string city, + string state, + string zip, + string country, + string jobTitle, + string company, + string department, + string office, + string managerAccountName, + string businessPhone, + string fax, + string homePhone, + string mobilePhone, + string pager, + string webPage, + string notes, + string externalEmail, + string subscriberNumber) + { object[] results = this.Invoke("SetUserGeneralSettings", new object[] { itemId, accountId, @@ -933,42 +1158,45 @@ namespace WebsitePanel.EnterpriseServer.HostedSolution { pager, webPage, notes, - externalEmail}); + externalEmail, + subscriberNumber}); return ((int)(results[0])); } - + /// public System.IAsyncResult BeginSetUserGeneralSettings( - int itemId, - int accountId, - string displayName, - string password, - bool hideAddressBook, - bool disabled, - bool locked, - string firstName, - string initials, - string lastName, - string address, - string city, - string state, - string zip, - string country, - string jobTitle, - string company, - string department, - string office, - string managerAccountName, - string businessPhone, - string fax, - string homePhone, - string mobilePhone, - string pager, - string webPage, - string notes, - string externalEmail, - System.AsyncCallback callback, - object asyncState) { + int itemId, + int accountId, + string displayName, + string password, + bool hideAddressBook, + bool disabled, + bool locked, + string firstName, + string initials, + string lastName, + string address, + string city, + string state, + string zip, + string country, + string jobTitle, + string company, + string department, + string office, + string managerAccountName, + string businessPhone, + string fax, + string homePhone, + string mobilePhone, + string pager, + string webPage, + string notes, + string externalEmail, + string subscriberNumber, + System.AsyncCallback callback, + object asyncState) + { return this.BeginInvoke("SetUserGeneralSettings", new object[] { itemId, accountId, @@ -997,80 +1225,87 @@ namespace WebsitePanel.EnterpriseServer.HostedSolution { pager, webPage, notes, - externalEmail}, callback, asyncState); + externalEmail, + subscriberNumber}, callback, asyncState); } - + /// - public int EndSetUserGeneralSettings(System.IAsyncResult asyncResult) { + public int EndSetUserGeneralSettings(System.IAsyncResult asyncResult) + { object[] results = this.EndInvoke(asyncResult); return ((int)(results[0])); } - + /// public void SetUserGeneralSettingsAsync( - int itemId, - int accountId, - string displayName, - string password, - bool hideAddressBook, - bool disabled, - bool locked, - string firstName, - string initials, - string lastName, - string address, - string city, - string state, - string zip, - string country, - string jobTitle, - string company, - string department, - string office, - string managerAccountName, - string businessPhone, - string fax, - string homePhone, - string mobilePhone, - string pager, - string webPage, - string notes, - string externalEmail) { - this.SetUserGeneralSettingsAsync(itemId, accountId, displayName, password, hideAddressBook, disabled, locked, firstName, initials, lastName, address, city, state, zip, country, jobTitle, company, department, office, managerAccountName, businessPhone, fax, homePhone, mobilePhone, pager, webPage, notes, externalEmail, null); + int itemId, + int accountId, + string displayName, + string password, + bool hideAddressBook, + bool disabled, + bool locked, + string firstName, + string initials, + string lastName, + string address, + string city, + string state, + string zip, + string country, + string jobTitle, + string company, + string department, + string office, + string managerAccountName, + string businessPhone, + string fax, + string homePhone, + string mobilePhone, + string pager, + string webPage, + string notes, + string externalEmail, + string subscriberNumber) + { + this.SetUserGeneralSettingsAsync(itemId, accountId, displayName, password, hideAddressBook, disabled, locked, firstName, initials, lastName, address, city, state, zip, country, jobTitle, company, department, office, managerAccountName, businessPhone, fax, homePhone, mobilePhone, pager, webPage, notes, externalEmail, subscriberNumber, null); } - + /// public void SetUserGeneralSettingsAsync( - int itemId, - int accountId, - string displayName, - string password, - bool hideAddressBook, - bool disabled, - bool locked, - string firstName, - string initials, - string lastName, - string address, - string city, - string state, - string zip, - string country, - string jobTitle, - string company, - string department, - string office, - string managerAccountName, - string businessPhone, - string fax, - string homePhone, - string mobilePhone, - string pager, - string webPage, - string notes, - string externalEmail, - object userState) { - if ((this.SetUserGeneralSettingsOperationCompleted == null)) { + int itemId, + int accountId, + string displayName, + string password, + bool hideAddressBook, + bool disabled, + bool locked, + string firstName, + string initials, + string lastName, + string address, + string city, + string state, + string zip, + string country, + string jobTitle, + string company, + string department, + string office, + string managerAccountName, + string businessPhone, + string fax, + string homePhone, + string mobilePhone, + string pager, + string webPage, + string notes, + string externalEmail, + string subscriberNumber, + object userState) + { + if ((this.SetUserGeneralSettingsOperationCompleted == null)) + { this.SetUserGeneralSettingsOperationCompleted = new System.Threading.SendOrPostCallback(this.OnSetUserGeneralSettingsOperationCompleted); } this.InvokeAsync("SetUserGeneralSettings", new object[] { @@ -1101,19 +1336,23 @@ namespace WebsitePanel.EnterpriseServer.HostedSolution { pager, webPage, notes, - externalEmail}, this.SetUserGeneralSettingsOperationCompleted, userState); + externalEmail, + subscriberNumber}, this.SetUserGeneralSettingsOperationCompleted, userState); } - - private void OnSetUserGeneralSettingsOperationCompleted(object arg) { - if ((this.SetUserGeneralSettingsCompleted != null)) { + + private void OnSetUserGeneralSettingsOperationCompleted(object arg) + { + if ((this.SetUserGeneralSettingsCompleted != null)) + { System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); this.SetUserGeneralSettingsCompleted(this, new SetUserGeneralSettingsCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); } } - + /// - [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://tempuri.org/SearchAccounts", RequestNamespace="http://tempuri.org/", ResponseNamespace="http://tempuri.org/", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] - public OrganizationUser[] SearchAccounts(int itemId, string filterColumn, string filterValue, string sortColumn, bool includeMailboxes) { + [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://tempuri.org/SearchAccounts", RequestNamespace = "http://tempuri.org/", ResponseNamespace = "http://tempuri.org/", Use = System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle = System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] + public OrganizationUser[] SearchAccounts(int itemId, string filterColumn, string filterValue, string sortColumn, bool includeMailboxes) + { object[] results = this.Invoke("SearchAccounts", new object[] { itemId, filterColumn, @@ -1122,9 +1361,10 @@ namespace WebsitePanel.EnterpriseServer.HostedSolution { includeMailboxes}); return ((OrganizationUser[])(results[0])); } - + /// - public System.IAsyncResult BeginSearchAccounts(int itemId, string filterColumn, string filterValue, string sortColumn, bool includeMailboxes, System.AsyncCallback callback, object asyncState) { + public System.IAsyncResult BeginSearchAccounts(int itemId, string filterColumn, string filterValue, string sortColumn, bool includeMailboxes, System.AsyncCallback callback, object asyncState) + { return this.BeginInvoke("SearchAccounts", new object[] { itemId, filterColumn, @@ -1132,21 +1372,25 @@ namespace WebsitePanel.EnterpriseServer.HostedSolution { sortColumn, includeMailboxes}, callback, asyncState); } - + /// - public OrganizationUser[] EndSearchAccounts(System.IAsyncResult asyncResult) { + public OrganizationUser[] EndSearchAccounts(System.IAsyncResult asyncResult) + { object[] results = this.EndInvoke(asyncResult); return ((OrganizationUser[])(results[0])); } - + /// - public void SearchAccountsAsync(int itemId, string filterColumn, string filterValue, string sortColumn, bool includeMailboxes) { + public void SearchAccountsAsync(int itemId, string filterColumn, string filterValue, string sortColumn, bool includeMailboxes) + { this.SearchAccountsAsync(itemId, filterColumn, filterValue, sortColumn, includeMailboxes, null); } - + /// - public void SearchAccountsAsync(int itemId, string filterColumn, string filterValue, string sortColumn, bool includeMailboxes, object userState) { - if ((this.SearchAccountsOperationCompleted == null)) { + public void SearchAccountsAsync(int itemId, string filterColumn, string filterValue, string sortColumn, bool includeMailboxes, object userState) + { + if ((this.SearchAccountsOperationCompleted == null)) + { this.SearchAccountsOperationCompleted = new System.Threading.SendOrPostCallback(this.OnSearchAccountsOperationCompleted); } this.InvokeAsync("SearchAccounts", new object[] { @@ -1156,604 +1400,748 @@ namespace WebsitePanel.EnterpriseServer.HostedSolution { sortColumn, includeMailboxes}, this.SearchAccountsOperationCompleted, userState); } - - private void OnSearchAccountsOperationCompleted(object arg) { - if ((this.SearchAccountsCompleted != null)) { + + private void OnSearchAccountsOperationCompleted(object arg) + { + if ((this.SearchAccountsCompleted != null)) + { System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); this.SearchAccountsCompleted(this, new SearchAccountsCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); } } - + /// - [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://tempuri.org/DeleteUser", RequestNamespace="http://tempuri.org/", ResponseNamespace="http://tempuri.org/", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] - public int DeleteUser(int itemId, int accountId) { + [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://tempuri.org/DeleteUser", RequestNamespace = "http://tempuri.org/", ResponseNamespace = "http://tempuri.org/", Use = System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle = System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] + public int DeleteUser(int itemId, int accountId) + { object[] results = this.Invoke("DeleteUser", new object[] { itemId, accountId}); return ((int)(results[0])); } - + /// - public System.IAsyncResult BeginDeleteUser(int itemId, int accountId, System.AsyncCallback callback, object asyncState) { + public System.IAsyncResult BeginDeleteUser(int itemId, int accountId, System.AsyncCallback callback, object asyncState) + { return this.BeginInvoke("DeleteUser", new object[] { itemId, accountId}, callback, asyncState); } - + /// - public int EndDeleteUser(System.IAsyncResult asyncResult) { + public int EndDeleteUser(System.IAsyncResult asyncResult) + { object[] results = this.EndInvoke(asyncResult); return ((int)(results[0])); } - + /// - public void DeleteUserAsync(int itemId, int accountId) { + public void DeleteUserAsync(int itemId, int accountId) + { this.DeleteUserAsync(itemId, accountId, null); } - + /// - public void DeleteUserAsync(int itemId, int accountId, object userState) { - if ((this.DeleteUserOperationCompleted == null)) { + public void DeleteUserAsync(int itemId, int accountId, object userState) + { + if ((this.DeleteUserOperationCompleted == null)) + { this.DeleteUserOperationCompleted = new System.Threading.SendOrPostCallback(this.OnDeleteUserOperationCompleted); } this.InvokeAsync("DeleteUser", new object[] { itemId, accountId}, this.DeleteUserOperationCompleted, userState); } - - private void OnDeleteUserOperationCompleted(object arg) { - if ((this.DeleteUserCompleted != null)) { + + private void OnDeleteUserOperationCompleted(object arg) + { + if ((this.DeleteUserCompleted != null)) + { System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); this.DeleteUserCompleted(this, new DeleteUserCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); } } - + /// - [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://tempuri.org/GetPasswordPolicy", RequestNamespace="http://tempuri.org/", ResponseNamespace="http://tempuri.org/", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] - public PasswordPolicyResult GetPasswordPolicy(int itemId) { + [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://tempuri.org/GetPasswordPolicy", RequestNamespace = "http://tempuri.org/", ResponseNamespace = "http://tempuri.org/", Use = System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle = System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] + public PasswordPolicyResult GetPasswordPolicy(int itemId) + { object[] results = this.Invoke("GetPasswordPolicy", new object[] { itemId}); return ((PasswordPolicyResult)(results[0])); } - + /// - public System.IAsyncResult BeginGetPasswordPolicy(int itemId, System.AsyncCallback callback, object asyncState) { + public System.IAsyncResult BeginGetPasswordPolicy(int itemId, System.AsyncCallback callback, object asyncState) + { return this.BeginInvoke("GetPasswordPolicy", new object[] { itemId}, callback, asyncState); } - + /// - public PasswordPolicyResult EndGetPasswordPolicy(System.IAsyncResult asyncResult) { + public PasswordPolicyResult EndGetPasswordPolicy(System.IAsyncResult asyncResult) + { object[] results = this.EndInvoke(asyncResult); return ((PasswordPolicyResult)(results[0])); } - + /// - public void GetPasswordPolicyAsync(int itemId) { + public void GetPasswordPolicyAsync(int itemId) + { this.GetPasswordPolicyAsync(itemId, null); } - + /// - public void GetPasswordPolicyAsync(int itemId, object userState) { - if ((this.GetPasswordPolicyOperationCompleted == null)) { + public void GetPasswordPolicyAsync(int itemId, object userState) + { + if ((this.GetPasswordPolicyOperationCompleted == null)) + { this.GetPasswordPolicyOperationCompleted = new System.Threading.SendOrPostCallback(this.OnGetPasswordPolicyOperationCompleted); } this.InvokeAsync("GetPasswordPolicy", new object[] { itemId}, this.GetPasswordPolicyOperationCompleted, userState); } - - private void OnGetPasswordPolicyOperationCompleted(object arg) { - if ((this.GetPasswordPolicyCompleted != null)) { + + private void OnGetPasswordPolicyOperationCompleted(object arg) + { + if ((this.GetPasswordPolicyCompleted != null)) + { System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); this.GetPasswordPolicyCompleted(this, new GetPasswordPolicyCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); } } - + /// - public new void CancelAsync(object userState) { + public new void CancelAsync(object userState) + { base.CancelAsync(userState); } } - - - - - - - - - - - - + /// [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] public delegate void CreateOrganizationCompletedEventHandler(object sender, CreateOrganizationCompletedEventArgs e); - + /// [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] [System.Diagnostics.DebuggerStepThroughAttribute()] [System.ComponentModel.DesignerCategoryAttribute("code")] - public partial class CreateOrganizationCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { - + public partial class CreateOrganizationCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs + { + private object[] results; - - internal CreateOrganizationCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : - base(exception, cancelled, userState) { + + internal CreateOrganizationCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + base(exception, cancelled, userState) + { this.results = results; } - + /// - public int Result { - get { + public int Result + { + get + { this.RaiseExceptionIfNecessary(); return ((int)(this.results[0])); } } } - + /// [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] public delegate void GetRawOrganizationsPagedCompletedEventHandler(object sender, GetRawOrganizationsPagedCompletedEventArgs e); - + /// [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] [System.Diagnostics.DebuggerStepThroughAttribute()] [System.ComponentModel.DesignerCategoryAttribute("code")] - public partial class GetRawOrganizationsPagedCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { - + public partial class GetRawOrganizationsPagedCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs + { + private object[] results; - - internal GetRawOrganizationsPagedCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : - base(exception, cancelled, userState) { + + internal GetRawOrganizationsPagedCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + base(exception, cancelled, userState) + { this.results = results; } - + /// - public System.Data.DataSet Result { - get { + public System.Data.DataSet Result + { + get + { this.RaiseExceptionIfNecessary(); return ((System.Data.DataSet)(this.results[0])); } } } - + /// [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] public delegate void GetOrganizationsCompletedEventHandler(object sender, GetOrganizationsCompletedEventArgs e); - + /// [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] [System.Diagnostics.DebuggerStepThroughAttribute()] [System.ComponentModel.DesignerCategoryAttribute("code")] - public partial class GetOrganizationsCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { - + public partial class GetOrganizationsCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs + { + private object[] results; - - internal GetOrganizationsCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : - base(exception, cancelled, userState) { + + internal GetOrganizationsCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + base(exception, cancelled, userState) + { this.results = results; } - + /// - public Organization[] Result { - get { + public Organization[] Result + { + get + { this.RaiseExceptionIfNecessary(); return ((Organization[])(this.results[0])); } } } - + /// [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] public delegate void GetOrganizationUserSummuryLetterCompletedEventHandler(object sender, GetOrganizationUserSummuryLetterCompletedEventArgs e); - + /// [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] [System.Diagnostics.DebuggerStepThroughAttribute()] [System.ComponentModel.DesignerCategoryAttribute("code")] - public partial class GetOrganizationUserSummuryLetterCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { - + public partial class GetOrganizationUserSummuryLetterCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs + { + private object[] results; - - internal GetOrganizationUserSummuryLetterCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : - base(exception, cancelled, userState) { + + internal GetOrganizationUserSummuryLetterCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + base(exception, cancelled, userState) + { this.results = results; } - + /// - public string Result { - get { + public string Result + { + get + { this.RaiseExceptionIfNecessary(); return ((string)(this.results[0])); } } } - + /// [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] public delegate void SendOrganizationUserSummuryLetterCompletedEventHandler(object sender, SendOrganizationUserSummuryLetterCompletedEventArgs e); - + /// [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] [System.Diagnostics.DebuggerStepThroughAttribute()] [System.ComponentModel.DesignerCategoryAttribute("code")] - public partial class SendOrganizationUserSummuryLetterCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { - + public partial class SendOrganizationUserSummuryLetterCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs + { + private object[] results; - - internal SendOrganizationUserSummuryLetterCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : - base(exception, cancelled, userState) { + + internal SendOrganizationUserSummuryLetterCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + base(exception, cancelled, userState) + { this.results = results; } - + /// - public int Result { - get { + public int Result + { + get + { this.RaiseExceptionIfNecessary(); return ((int)(this.results[0])); } } } - + /// [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] public delegate void DeleteOrganizationCompletedEventHandler(object sender, DeleteOrganizationCompletedEventArgs e); - + /// [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] [System.Diagnostics.DebuggerStepThroughAttribute()] [System.ComponentModel.DesignerCategoryAttribute("code")] - public partial class DeleteOrganizationCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { - + public partial class DeleteOrganizationCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs + { + private object[] results; - - internal DeleteOrganizationCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : - base(exception, cancelled, userState) { + + internal DeleteOrganizationCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + base(exception, cancelled, userState) + { this.results = results; } - + /// - public int Result { - get { + public int Result + { + get + { this.RaiseExceptionIfNecessary(); return ((int)(this.results[0])); } } } - + /// [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] public delegate void GetOrganizationStatisticsCompletedEventHandler(object sender, GetOrganizationStatisticsCompletedEventArgs e); - + /// [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] [System.Diagnostics.DebuggerStepThroughAttribute()] [System.ComponentModel.DesignerCategoryAttribute("code")] - public partial class GetOrganizationStatisticsCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { - + public partial class GetOrganizationStatisticsCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs + { + private object[] results; - - internal GetOrganizationStatisticsCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : - base(exception, cancelled, userState) { + + internal GetOrganizationStatisticsCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + base(exception, cancelled, userState) + { this.results = results; } - + /// - public OrganizationStatistics Result { - get { + public OrganizationStatistics Result + { + get + { this.RaiseExceptionIfNecessary(); return ((OrganizationStatistics)(this.results[0])); } } } - + /// [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] public delegate void GetOrganizationCompletedEventHandler(object sender, GetOrganizationCompletedEventArgs e); - + /// [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] [System.Diagnostics.DebuggerStepThroughAttribute()] [System.ComponentModel.DesignerCategoryAttribute("code")] - public partial class GetOrganizationCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { - + public partial class GetOrganizationCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs + { + private object[] results; - - internal GetOrganizationCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : - base(exception, cancelled, userState) { + + internal GetOrganizationCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + base(exception, cancelled, userState) + { this.results = results; } - + /// - public Organization Result { - get { + public Organization Result + { + get + { this.RaiseExceptionIfNecessary(); return ((Organization)(this.results[0])); } } } - + /// [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] - public delegate void AddOrganizationDomainCompletedEventHandler(object sender, AddOrganizationDomainCompletedEventArgs e); - + public delegate void GetAccountIdByUserPrincipalNameCompletedEventHandler(object sender, GetAccountIdByUserPrincipalNameCompletedEventArgs e); + /// [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] [System.Diagnostics.DebuggerStepThroughAttribute()] [System.ComponentModel.DesignerCategoryAttribute("code")] - public partial class AddOrganizationDomainCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { - + public partial class GetAccountIdByUserPrincipalNameCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs + { + private object[] results; - - internal AddOrganizationDomainCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : - base(exception, cancelled, userState) { + + internal GetAccountIdByUserPrincipalNameCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + base(exception, cancelled, userState) + { this.results = results; } - + /// - public int Result { - get { + public int Result + { + get + { this.RaiseExceptionIfNecessary(); return ((int)(this.results[0])); } } } - + /// [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] - public delegate void GetOrganizationDomainsCompletedEventHandler(object sender, GetOrganizationDomainsCompletedEventArgs e); - + public delegate void AddOrganizationDomainCompletedEventHandler(object sender, AddOrganizationDomainCompletedEventArgs e); + /// [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] [System.Diagnostics.DebuggerStepThroughAttribute()] [System.ComponentModel.DesignerCategoryAttribute("code")] - public partial class GetOrganizationDomainsCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { - + public partial class AddOrganizationDomainCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs + { + private object[] results; - - internal GetOrganizationDomainsCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : - base(exception, cancelled, userState) { + + internal AddOrganizationDomainCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + base(exception, cancelled, userState) + { this.results = results; } - + /// - public OrganizationDomainName[] Result { - get { + public int Result + { + get + { + this.RaiseExceptionIfNecessary(); + return ((int)(this.results[0])); + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + public delegate void GetOrganizationDomainsCompletedEventHandler(object sender, GetOrganizationDomainsCompletedEventArgs e); + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + public partial class GetOrganizationDomainsCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs + { + + private object[] results; + + internal GetOrganizationDomainsCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + base(exception, cancelled, userState) + { + this.results = results; + } + + /// + public OrganizationDomainName[] Result + { + get + { this.RaiseExceptionIfNecessary(); return ((OrganizationDomainName[])(this.results[0])); } } } - + /// [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] public delegate void DeleteOrganizationDomainCompletedEventHandler(object sender, DeleteOrganizationDomainCompletedEventArgs e); - + /// [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] [System.Diagnostics.DebuggerStepThroughAttribute()] [System.ComponentModel.DesignerCategoryAttribute("code")] - public partial class DeleteOrganizationDomainCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { - + public partial class DeleteOrganizationDomainCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs + { + private object[] results; - - internal DeleteOrganizationDomainCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : - base(exception, cancelled, userState) { + + internal DeleteOrganizationDomainCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + base(exception, cancelled, userState) + { this.results = results; } - + /// - public int Result { - get { + public int Result + { + get + { this.RaiseExceptionIfNecessary(); return ((int)(this.results[0])); } } } - + /// [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] public delegate void SetOrganizationDefaultDomainCompletedEventHandler(object sender, SetOrganizationDefaultDomainCompletedEventArgs e); - + /// [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] [System.Diagnostics.DebuggerStepThroughAttribute()] [System.ComponentModel.DesignerCategoryAttribute("code")] - public partial class SetOrganizationDefaultDomainCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { - + public partial class SetOrganizationDefaultDomainCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs + { + private object[] results; - - internal SetOrganizationDefaultDomainCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : - base(exception, cancelled, userState) { + + internal SetOrganizationDefaultDomainCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + base(exception, cancelled, userState) + { this.results = results; } - + /// - public int Result { - get { + public int Result + { + get + { this.RaiseExceptionIfNecessary(); return ((int)(this.results[0])); } } } - + /// [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] public delegate void CreateUserCompletedEventHandler(object sender, CreateUserCompletedEventArgs e); - + /// [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] [System.Diagnostics.DebuggerStepThroughAttribute()] [System.ComponentModel.DesignerCategoryAttribute("code")] - public partial class CreateUserCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { - + public partial class CreateUserCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs + { + private object[] results; - - internal CreateUserCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : - base(exception, cancelled, userState) { + + internal CreateUserCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + base(exception, cancelled, userState) + { this.results = results; } - + /// - public int Result { - get { + public int Result + { + get + { this.RaiseExceptionIfNecessary(); return ((int)(this.results[0])); } } } - + /// [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] - public delegate void GetOrganizationUsersPagedCompletedEventHandler(object sender, GetOrganizationUsersPagedCompletedEventArgs e); - + public delegate void ImportUserCompletedEventHandler(object sender, ImportUserCompletedEventArgs e); + /// [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] [System.Diagnostics.DebuggerStepThroughAttribute()] [System.ComponentModel.DesignerCategoryAttribute("code")] - public partial class GetOrganizationUsersPagedCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { - + public partial class ImportUserCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs + { + private object[] results; - - internal GetOrganizationUsersPagedCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : - base(exception, cancelled, userState) { + + internal ImportUserCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + base(exception, cancelled, userState) + { this.results = results; } - + /// - public OrganizationUsersPaged Result { - get { + public int Result + { + get + { + this.RaiseExceptionIfNecessary(); + return ((int)(this.results[0])); + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + public delegate void GetOrganizationUsersPagedCompletedEventHandler(object sender, GetOrganizationUsersPagedCompletedEventArgs e); + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + public partial class GetOrganizationUsersPagedCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs + { + + private object[] results; + + internal GetOrganizationUsersPagedCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + base(exception, cancelled, userState) + { + this.results = results; + } + + /// + public OrganizationUsersPaged Result + { + get + { this.RaiseExceptionIfNecessary(); return ((OrganizationUsersPaged)(this.results[0])); } } } - + /// [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] public delegate void GetUserGeneralSettingsCompletedEventHandler(object sender, GetUserGeneralSettingsCompletedEventArgs e); - + /// [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] [System.Diagnostics.DebuggerStepThroughAttribute()] [System.ComponentModel.DesignerCategoryAttribute("code")] - public partial class GetUserGeneralSettingsCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { - + public partial class GetUserGeneralSettingsCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs + { + private object[] results; - - internal GetUserGeneralSettingsCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : - base(exception, cancelled, userState) { + + internal GetUserGeneralSettingsCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + base(exception, cancelled, userState) + { this.results = results; } - + /// - public OrganizationUser Result { - get { + public OrganizationUser Result + { + get + { this.RaiseExceptionIfNecessary(); return ((OrganizationUser)(this.results[0])); } } } - + /// [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] public delegate void SetUserGeneralSettingsCompletedEventHandler(object sender, SetUserGeneralSettingsCompletedEventArgs e); - + /// [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] [System.Diagnostics.DebuggerStepThroughAttribute()] [System.ComponentModel.DesignerCategoryAttribute("code")] - public partial class SetUserGeneralSettingsCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { - + public partial class SetUserGeneralSettingsCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs + { + private object[] results; - - internal SetUserGeneralSettingsCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : - base(exception, cancelled, userState) { + + internal SetUserGeneralSettingsCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + base(exception, cancelled, userState) + { this.results = results; } - + /// - public int Result { - get { + public int Result + { + get + { this.RaiseExceptionIfNecessary(); return ((int)(this.results[0])); } } } - + /// [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] public delegate void SearchAccountsCompletedEventHandler(object sender, SearchAccountsCompletedEventArgs e); - + /// [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] [System.Diagnostics.DebuggerStepThroughAttribute()] [System.ComponentModel.DesignerCategoryAttribute("code")] - public partial class SearchAccountsCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { - + public partial class SearchAccountsCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs + { + private object[] results; - - internal SearchAccountsCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : - base(exception, cancelled, userState) { + + internal SearchAccountsCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + base(exception, cancelled, userState) + { this.results = results; } - + /// - public OrganizationUser[] Result { - get { + public OrganizationUser[] Result + { + get + { this.RaiseExceptionIfNecessary(); return ((OrganizationUser[])(this.results[0])); } } } - + /// [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] public delegate void DeleteUserCompletedEventHandler(object sender, DeleteUserCompletedEventArgs e); - + /// [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] [System.Diagnostics.DebuggerStepThroughAttribute()] [System.ComponentModel.DesignerCategoryAttribute("code")] - public partial class DeleteUserCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { - + public partial class DeleteUserCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs + { + private object[] results; - - internal DeleteUserCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : - base(exception, cancelled, userState) { + + internal DeleteUserCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + base(exception, cancelled, userState) + { this.results = results; } - + /// - public int Result { - get { + public int Result + { + get + { this.RaiseExceptionIfNecessary(); return ((int)(this.results[0])); } } } - + /// [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] public delegate void GetPasswordPolicyCompletedEventHandler(object sender, GetPasswordPolicyCompletedEventArgs e); - + /// [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] [System.Diagnostics.DebuggerStepThroughAttribute()] [System.ComponentModel.DesignerCategoryAttribute("code")] - public partial class GetPasswordPolicyCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { - + public partial class GetPasswordPolicyCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs + { + private object[] results; - - internal GetPasswordPolicyCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : - base(exception, cancelled, userState) { + + internal GetPasswordPolicyCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + base(exception, cancelled, userState) + { this.results = results; } - + /// - public PasswordPolicyResult Result { - get { + public PasswordPolicyResult Result + { + get + { this.RaiseExceptionIfNecessary(); return ((PasswordPolicyResult)(this.results[0])); } diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/Data/DataProvider.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/Data/DataProvider.cs index 1d4f770d..714b0165 100644 --- a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/Data/DataProvider.cs +++ b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/Data/DataProvider.cs @@ -2065,33 +2065,36 @@ namespace WebsitePanel.EnterpriseServer #endregion #region Exchange Server - - public static int AddExchangeAccount(int itemId, int accountType, string accountName, + + public static int AddExchangeAccount(int itemId, int accountType, string accountName, string displayName, string primaryEmailAddress, bool mailEnabledPublicFolder, - string mailboxManagerActions, string samAccountName, string accountPassword) - { - SqlParameter outParam = new SqlParameter("@AccountID", SqlDbType.Int); - outParam.Direction = ParameterDirection.Output; + string mailboxManagerActions, string samAccountName, string accountPassword, int mailboxPlanId, string subscriberNumber) + { + SqlParameter outParam = new SqlParameter("@AccountID", SqlDbType.Int); + outParam.Direction = ParameterDirection.Output; - SqlHelper.ExecuteNonQuery( - ConnectionString, - CommandType.StoredProcedure, - "AddExchangeAccount", - outParam, - new SqlParameter("@ItemID", itemId), - new SqlParameter("@AccountType", accountType), - new SqlParameter("@AccountName", accountName), - new SqlParameter("@DisplayName", displayName), - new SqlParameter("@PrimaryEmailAddress", primaryEmailAddress), - new SqlParameter("@MailEnabledPublicFolder", mailEnabledPublicFolder), + SqlHelper.ExecuteNonQuery( + ConnectionString, + CommandType.StoredProcedure, + "AddExchangeAccount", + outParam, + new SqlParameter("@ItemID", itemId), + new SqlParameter("@AccountType", accountType), + new SqlParameter("@AccountName", accountName), + new SqlParameter("@DisplayName", displayName), + new SqlParameter("@PrimaryEmailAddress", primaryEmailAddress), + new SqlParameter("@MailEnabledPublicFolder", mailEnabledPublicFolder), new SqlParameter("@MailboxManagerActions", mailboxManagerActions), new SqlParameter("@SamAccountName", samAccountName), - new SqlParameter("@AccountPassword", accountPassword) - ); + new SqlParameter("@AccountPassword", accountPassword), + new SqlParameter("@MailboxPlanId", (mailboxPlanId == 0) ? (object)DBNull.Value : (object)mailboxPlanId), + new SqlParameter("@SubscriberNumber", (string.IsNullOrEmpty(subscriberNumber) ? (object)DBNull.Value : (object)subscriberNumber)) + ); + + return Convert.ToInt32(outParam.Value); + } - return Convert.ToInt32(outParam.Value); - } public static void AddExchangeAccountEmailAddress(int accountId, string emailAddress) { @@ -2159,6 +2162,7 @@ namespace WebsitePanel.EnterpriseServer ); } + public static void DeleteExchangeAccountEmailAddress(int accountId, string emailAddress) { SqlHelper.ExecuteNonQuery( @@ -2255,26 +2259,27 @@ namespace WebsitePanel.EnterpriseServer return Convert.ToBoolean(outParam.Value); } - public static void UpdateExchangeAccount(int accountId, string accountName, ExchangeAccountType accountType, + public static void UpdateExchangeAccount(int accountId, string accountName, ExchangeAccountType accountType, string displayName, string primaryEmailAddress, bool mailEnabledPublicFolder, - string mailboxManagerActions, string samAccountName, string accountPassword) - { - SqlHelper.ExecuteNonQuery( - ConnectionString, - CommandType.StoredProcedure, - "UpdateExchangeAccount", - new SqlParameter("@AccountID", accountId), - new SqlParameter("@AccountName", accountName), - new SqlParameter("@DisplayName", displayName), + string mailboxManagerActions, string samAccountName, string accountPassword, int mailboxPlanId, string subscriberNumber) + { + SqlHelper.ExecuteNonQuery( + ConnectionString, + CommandType.StoredProcedure, + "UpdateExchangeAccount", + new SqlParameter("@AccountID", accountId), + new SqlParameter("@AccountName", accountName), + new SqlParameter("@DisplayName", displayName), new SqlParameter("@AccountType", (int)accountType), - new SqlParameter("@PrimaryEmailAddress", primaryEmailAddress), - new SqlParameter("@MailEnabledPublicFolder", mailEnabledPublicFolder), + new SqlParameter("@PrimaryEmailAddress", primaryEmailAddress), + new SqlParameter("@MailEnabledPublicFolder", mailEnabledPublicFolder), new SqlParameter("@MailboxManagerActions", mailboxManagerActions), new SqlParameter("@Password", string.IsNullOrEmpty(accountPassword) ? (object)DBNull.Value : (object)accountPassword), - new SqlParameter("@SamAccountName", samAccountName) - - ); - } + new SqlParameter("@SamAccountName", samAccountName), + new SqlParameter("@MailboxPlanId", (mailboxPlanId == 0) ? (object)DBNull.Value : (object)mailboxPlanId), + new SqlParameter("@SubscriberNumber", (string.IsNullOrEmpty(subscriberNumber) ? (object)DBNull.Value : (object)subscriberNumber)) + ); + } public static IDataReader GetExchangeAccount(int itemId, int accountId) { @@ -2287,6 +2292,17 @@ namespace WebsitePanel.EnterpriseServer ); } + public static IDataReader GetExchangeAccountByAccountName(int itemId, string accountName) + { + return SqlHelper.ExecuteReader( + ConnectionString, + CommandType.StoredProcedure, + "GetExchangeAccountByAccountName", + new SqlParameter("@ItemID", itemId), + new SqlParameter("@AccountName", accountName) + ); + } + public static IDataReader GetExchangeAccountEmailAddresses(int accountId) { return SqlHelper.ExecuteReader( @@ -2398,6 +2414,97 @@ namespace WebsitePanel.EnterpriseServer #endregion + #region Exchange Mailbox Plans + public static int AddExchangeMailboxPlan(int itemID, string mailboxPlan, bool enableActiveSync, bool enableIMAP, bool enableMAPI, bool enableOWA, bool enablePOP, + bool isDefault, int issueWarningPct, int keepDeletedItemsDays, int mailboxSizeMB, int maxReceiveMessageSizeKB, int maxRecipients, + int maxSendMessageSizeKB, int prohibitSendPct, int prohibitSendReceivePct, bool hideFromAddressBook) + { + SqlParameter outParam = new SqlParameter("@MailboxPlanId", SqlDbType.Int); + outParam.Direction = ParameterDirection.Output; + + SqlHelper.ExecuteNonQuery( + ConnectionString, + CommandType.StoredProcedure, + "AddExchangeMailboxPlan", + outParam, + new SqlParameter("@ItemID", itemID), + new SqlParameter("@MailboxPlan", mailboxPlan), + new SqlParameter("@EnableActiveSync", enableActiveSync), + new SqlParameter("@EnableIMAP", enableIMAP), + new SqlParameter("@EnableMAPI", enableMAPI), + new SqlParameter("@EnableOWA", enableOWA), + new SqlParameter("@EnablePOP", enablePOP), + new SqlParameter("@IsDefault", isDefault), + new SqlParameter("@IssueWarningPct", issueWarningPct), + new SqlParameter("@KeepDeletedItemsDays", keepDeletedItemsDays), + new SqlParameter("@MailboxSizeMB", mailboxSizeMB), + new SqlParameter("@MaxReceiveMessageSizeKB", maxReceiveMessageSizeKB), + new SqlParameter("@MaxRecipients", maxRecipients), + new SqlParameter("@MaxSendMessageSizeKB", maxSendMessageSizeKB), + new SqlParameter("@ProhibitSendPct", prohibitSendPct), + new SqlParameter("@ProhibitSendReceivePct", prohibitSendReceivePct), + new SqlParameter("@HideFromAddressBook", hideFromAddressBook) + ); + + return Convert.ToInt32(outParam.Value); + } + + + public static void DeleteExchangeMailboxPlan(int mailboxPlanId) + { + SqlHelper.ExecuteNonQuery( + ConnectionString, + CommandType.StoredProcedure, + "DeleteExchangeMailboxPlan", + new SqlParameter("@MailboxPlanId", mailboxPlanId) + ); + } + + + public static IDataReader GetExchangeMailboxPlan(int mailboxPlanId) + { + return SqlHelper.ExecuteReader( + ConnectionString, + CommandType.StoredProcedure, + "GetExchangeMailboxPlan", + new SqlParameter("@MailboxPlanId", mailboxPlanId) + ); + } + + public static IDataReader GetExchangeMailboxPlans(int itemId) + { + return SqlHelper.ExecuteReader( + ConnectionString, + CommandType.StoredProcedure, + "GetExchangeMailboxPlans", + new SqlParameter("@ItemID", itemId) + ); + } + + public static void SetOrganizationDefaultExchangeMailboxPlan(int itemId, int mailboxPlanId) + { + SqlHelper.ExecuteNonQuery( + ConnectionString, + CommandType.StoredProcedure, + "SetOrganizationDefaultExchangeMailboxPlan", + new SqlParameter("@ItemID", itemId), + new SqlParameter("@MailboxPlanId", mailboxPlanId) + ); + } + + public static void SetExchangeAccountMailboxPlan(int accountId, int mailboxPlanId) + { + SqlHelper.ExecuteNonQuery( + ConnectionString, + CommandType.StoredProcedure, + "SetExchangeAccountMailboxplan", + new SqlParameter("@AccountID", accountId), + new SqlParameter("@MailboxPlanId", (mailboxPlanId == 0) ? (object)DBNull.Value : (object)mailboxPlanId) + ); + } + + #endregion + #region Organizations public static void DeleteOrganizationUser(int itemId) diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/ExchangeServer/ExchangeServerController.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/ExchangeServer/ExchangeServerController.cs index 77eb5848..42a4e2bd 100644 --- a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/ExchangeServer/ExchangeServerController.cs +++ b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/ExchangeServer/ExchangeServerController.cs @@ -120,9 +120,6 @@ namespace WebsitePanel.EnterpriseServer org.Id = 1; org.OrganizationId = "fabrikam"; org.Name = "Fabrikam Inc"; - org.IssueWarningKB = 150000; - org.ProhibitSendKB = 170000; - org.ProhibitSendReceiveKB = 190000; org.KeepDeletedItemsDays = 14; return org; } @@ -167,7 +164,7 @@ namespace WebsitePanel.EnterpriseServer DataProvider.GetExchangeOrganizationStatistics(itemId)); // disk space - stats.UsedDiskSpace = org.DiskSpace; + //stats.UsedDiskSpace = org.DiskSpace; // allocated quotas PackageContext cntx = PackageController.GetPackageContext(org.PackageId); @@ -295,10 +292,6 @@ namespace WebsitePanel.EnterpriseServer ExchangeServer mailboxRole = GetExchangeServer(serviceId, org.ServiceId); - - - - bool authDomainCreated = false; @@ -307,10 +300,15 @@ namespace WebsitePanel.EnterpriseServer List domains = null; try - { + { + PackageContext cntx = PackageController.GetPackageContext(org.PackageId); + // 1) Create Organization (Mailbox) // ================================ - Organization exchangeOrganization = mailboxRole.ExtendToExchangeOrganization(org.OrganizationId, org.SecurityGroup); + Organization exchangeOrganization = mailboxRole.ExtendToExchangeOrganization(org.OrganizationId, + org.SecurityGroup, + Convert.ToBoolean(cntx.Quotas[Quotas.EXCHANGE2007_ISCONSUMER].QuotaAllocatedValue)); + organizationExtended = true; exchangeOrganization.OrganizationId = org.OrganizationId; @@ -386,17 +384,17 @@ namespace WebsitePanel.EnterpriseServer break; } - PackageContext cntx = PackageController.GetPackageContext(org.PackageId); - // organization limits - org.IssueWarningKB = cntx.Quotas[Quotas.EXCHANGE2007_DISKSPACE].QuotaAllocatedValue; - if (org.IssueWarningKB > 0) - org.IssueWarningKB *= Convert.ToInt32(1024*0.9); //90% - org.ProhibitSendKB = cntx.Quotas[Quotas.EXCHANGE2007_DISKSPACE].QuotaAllocatedValue; - if (org.ProhibitSendKB > 0) - org.ProhibitSendKB *= 1024; //100% - org.ProhibitSendReceiveKB = cntx.Quotas[Quotas.EXCHANGE2007_DISKSPACE].QuotaAllocatedValue; - if (org.ProhibitSendReceiveKB > 0) - org.ProhibitSendReceiveKB *= 1024; //100% + + // 4) Add the address book policy (Exchange 2010 SP2 + // + // ========================================== + Organization OrgTmp = mailboxRole.CreateOrganizationAddressBookPolicy(org.OrganizationId, + org.GlobalAddressList, + org.AddressList, + org.RoomsAddressList, + org.OfflineAddressBook); + + org.AddressBookPolicy = OrgTmp.AddressBookPolicy; StringDictionary settings = ServerController.GetServiceSettings(serviceId); org.KeepDeletedItemsDays = Utils.ParseInt(settings["KeepDeletedItemsDays"], 14); @@ -406,9 +404,9 @@ namespace WebsitePanel.EnterpriseServer { // rollback organization creation - if (organizationExtended) + if (organizationExtended) mailboxRole.DeleteOrganization(org.OrganizationId, org.DistinguishedName, - org.GlobalAddressList, org.AddressList, org.RoomsAddressList, org.OfflineAddressBook, org.SecurityGroup); + org.GlobalAddressList, org.AddressList, org.RoomsAddressList, org.OfflineAddressBook, org.SecurityGroup, org.AddressBookPolicy); // rollback domain if (authDomainCreated) @@ -498,16 +496,16 @@ namespace WebsitePanel.EnterpriseServer int exchangeServiceId = GetExchangeServiceID(org.PackageId); ExchangeServer exchange = GetExchangeServer(exchangeServiceId, org.ServiceId); - - bool successful = exchange.DeleteOrganization( - org.OrganizationId, - org.DistinguishedName, - org.GlobalAddressList, - org.AddressList, - org.RoomsAddressList, - org.OfflineAddressBook, - org.SecurityGroup); + bool successful = exchange.DeleteOrganization( + org.OrganizationId, + org.DistinguishedName, + org.GlobalAddressList, + org.AddressList, + org.RoomsAddressList, + org.OfflineAddressBook, + org.SecurityGroup, + org.AddressBookPolicy); return successful ? 0 : BusinessErrorCodes.ERROR_EXCHANGE_DELETE_SOME_PROBLEMS; @@ -571,9 +569,6 @@ namespace WebsitePanel.EnterpriseServer return BusinessErrorCodes.ERROR_EXCHANGE_STORAGE_QUOTAS_EXCEED_HOST_VALUES; // set limits - org.IssueWarningKB = issueWarningKB; - org.ProhibitSendKB = prohibitSendKB; - org.ProhibitSendReceiveKB = prohibitSendReceiveKB; org.KeepDeletedItemsDays = keepDeletedItemsDays; // save organization @@ -665,6 +660,39 @@ namespace WebsitePanel.EnterpriseServer } } + public static ExchangeMailboxStatistics GetMailboxStatistics(int itemId, int accountId) + { + // place log record + TaskManager.StartTask("EXCHANGE", "GET_MAILBOX_STATS"); + TaskManager.ItemId = itemId; + + try + { + Organization org = (Organization)PackageController.GetPackageItem(itemId); + if (org == null) + return null; + + + // get stats + int exchangeServiceId = GetExchangeServiceID(org.PackageId); + ExchangeServer exchange = GetExchangeServer(exchangeServiceId, org.ServiceId); + + // load account + ExchangeAccount account = GetAccount(itemId, accountId); + + return exchange.GetMailboxStatistics(account.AccountName); + } + catch (Exception ex) + { + throw TaskManager.WriteError(ex); + } + finally + { + TaskManager.CompleteTask(); + } + } + + public static ExchangeItemStatistics[] GetPublicFoldersStatistics(int itemId) { #region Demo Mode @@ -1087,21 +1115,22 @@ namespace WebsitePanel.EnterpriseServer return account; } - private static int AddAccount(int itemId, ExchangeAccountType accountType, - string accountName, string displayName, string primaryEmailAddress, bool mailEnabledPublicFolder, - MailboxManagerActions mailboxManagerActions, string samAccountName, string accountPassword) - { - return DataProvider.AddExchangeAccount(itemId, (int)accountType, - accountName, displayName, primaryEmailAddress, mailEnabledPublicFolder, - mailboxManagerActions.ToString(), samAccountName, CryptoUtils.Encrypt(accountPassword)); - } + private static int AddAccount(int itemId, ExchangeAccountType accountType, + string accountName, string displayName, string primaryEmailAddress, bool mailEnabledPublicFolder, + MailboxManagerActions mailboxManagerActions, string samAccountName, string accountPassword, int mailboxPlanId, string subscriberNumber) + { + return DataProvider.AddExchangeAccount(itemId, (int)accountType, + accountName, displayName, primaryEmailAddress, mailEnabledPublicFolder, + mailboxManagerActions.ToString(), samAccountName, CryptoUtils.Encrypt(accountPassword), mailboxPlanId, subscriberNumber.Trim()); + } - private static void UpdateAccount(ExchangeAccount account) - { - DataProvider.UpdateExchangeAccount(account.AccountId, account.AccountName, account.AccountType, account.DisplayName, - account.PrimaryEmailAddress,account.MailEnabledPublicFolder, - account.MailboxManagerActions.ToString(), account.SamAccountName, account.AccountPassword); - } + private static void UpdateAccount(ExchangeAccount account) + { + DataProvider.UpdateExchangeAccount(account.AccountId, account.AccountName, account.AccountType, account.DisplayName, + account.PrimaryEmailAddress, account.MailEnabledPublicFolder, + account.MailboxManagerActions.ToString(), account.SamAccountName, account.AccountPassword, account.MailboxPlanId, + (string.IsNullOrEmpty(account.SubscriberNumber) ? null : account.SubscriberNumber.Trim())); + } private static void DeleteAccount(int itemId, int accountId) { @@ -1112,29 +1141,41 @@ namespace WebsitePanel.EnterpriseServer DataProvider.DeleteExchangeAccount(itemId, accountId); } - private static string BuildAccountName(string orgId, string name) - { - int maxLen = 19 - orgId.Length; + private static string BuildAccountName(string orgId, string name) + { + string accountName = name = name.Replace(" ", ""); + string CounterStr = "00000"; + int counter = 0; + bool bFound = false; + do + { + accountName = genSamLogin(name, CounterStr); - // try to choose name - int i = 0; - while (true) - { - string num = i > 0 ? i.ToString() : ""; - int len = maxLen - num.Length; + if (!AccountExists(accountName)) bFound = true; - if (name.Length > len) - name = name.Substring(0, len); + CounterStr = counter.ToString("d5"); + counter++; + } + while (!bFound); - string accountName = name + num + "_" + orgId; + return accountName; + } - // check if already exists - if (!AccountExists(accountName)) - return accountName; + private static string genSamLogin(string login, string strCounter) + { + int maxLogin = 20; + int fullLen = login.Length + strCounter.Length; + if (fullLen <= maxLogin) + return login + strCounter; + else + { + if (login.Length - (fullLen - maxLogin) > 0) + return login.Substring(0, login.Length - (fullLen - maxLogin)) + strCounter; + else return strCounter; // ???? + } + + } - i++; - } - } #endregion @@ -1375,160 +1416,198 @@ namespace WebsitePanel.EnterpriseServer #endregion #region Mailboxes - - private static void UpdateExchangeAccount(int accountId, string accountName, ExchangeAccountType accountType, + + private static void UpdateExchangeAccount(int accountId, string accountName, ExchangeAccountType accountType, string displayName, string primaryEmailAddress, bool mailEnabledPublicFolder, - string mailboxManagerActions, string samAccountName, string accountPassword) - { - DataProvider.UpdateExchangeAccount(accountId, - accountName, - accountType, - displayName, - primaryEmailAddress, - mailEnabledPublicFolder, + string mailboxManagerActions, string samAccountName, string accountPassword, int mailboxPlanId, string subscriberNumber) + { + DataProvider.UpdateExchangeAccount(accountId, + accountName, + accountType, + displayName, + primaryEmailAddress, + mailEnabledPublicFolder, mailboxManagerActions, samAccountName, - CryptoUtils.Encrypt(accountPassword)); + CryptoUtils.Encrypt(accountPassword), + mailboxPlanId, + (string.IsNullOrEmpty(subscriberNumber) ? null : subscriberNumber.Trim())); } - public static int CreateMailbox(int itemId, int accountId, ExchangeAccountType accountType, string accountName, - string displayName, string name, string domain, string password, bool sendSetupInstructions, string setupInstructionMailAddress) - { - // check account - int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo | DemandAccount.IsActive); - if (accountCheck < 0) return accountCheck; + public static int CreateMailbox(int itemId, int accountId, ExchangeAccountType accountType, string accountName, + string displayName, string name, string domain, string password, bool sendSetupInstructions, string setupInstructionMailAddress, int mailboxPlanId, string subscriberNumber) + { + // check account + int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo | DemandAccount.IsActive); + if (accountCheck < 0) return accountCheck; - // check mailbox quota - OrganizationStatistics orgStats = GetOrganizationStatistics(itemId); - if ((orgStats.AllocatedMailboxes > -1 ) && ( orgStats.CreatedMailboxes >= orgStats.AllocatedMailboxes)) - return BusinessErrorCodes.ERROR_EXCHANGE_MAILBOXES_QUOTA_LIMIT; - - // place log record - TaskManager.StartTask("EXCHANGE", "CREATE_MAILBOX"); - TaskManager.ItemId = itemId; - bool userCreated = false; - Organization org = null; - try - { - // load organization - org = GetOrganization(itemId); - if (org == null) - return -1; - - // e-mail - string email = name + "@" + domain; - bool enabled = (accountType == ExchangeAccountType.Mailbox); - - - // string accountName = string.Empty; - //Create AD user if needed - if (accountId == 0) - { - accountId = OrganizationController.CreateUser(org.Id, displayName, name, domain, password, enabled, false, string.Empty, out accountName); - if (accountId > 0) - userCreated = true; - } - if (accountId < 0) - return accountId; - - int exchangeServiceId = PackageController.GetPackageServiceId(org.PackageId, ResourceGroups.Exchange); - - ExchangeServer exchange = GetExchangeServer(exchangeServiceId, org.ServiceId); + // check mailbox quota + OrganizationStatistics orgStats = GetOrganizationStatistics(itemId); + if ((orgStats.AllocatedMailboxes > -1) && (orgStats.CreatedMailboxes >= orgStats.AllocatedMailboxes)) + return BusinessErrorCodes.ERROR_EXCHANGE_MAILBOXES_QUOTA_LIMIT; - //Create Exchange Organization - if (string.IsNullOrEmpty(org.GlobalAddressList)) - { - ExtendToExchangeOrganization(ref org); - - PackageController.UpdatePackageItem(org); - } - - // check package - int packageCheck = SecurityContext.CheckPackage(org.PackageId, DemandPackage.IsActive); - if (packageCheck < 0) return packageCheck; + // place log record + TaskManager.StartTask("EXCHANGE", "CREATE_MAILBOX"); + TaskManager.ItemId = itemId; + bool userCreated = false; + Organization org = null; + try + { + accountName = accountName.Trim(); + displayName = displayName.Trim(); + name = name.Trim(); + domain = domain.Trim(); - // load package context - PackageContext cntx = PackageController.GetPackageContext(org.PackageId); + // load organization + org = GetOrganization(itemId); + if (org == null) + return -1; + + // e-mail + string email = name + "@" + domain; + bool enabled = (accountType == ExchangeAccountType.Mailbox); - string samAccount = exchange.CreateMailEnableUser(email, org.OrganizationId, org.DistinguishedName, accountType, org.Database, - org.OfflineAddressBook, - accountName, - QuotaEnabled(cntx, Quotas.EXCHANGE2007_POP3ENABLED), - QuotaEnabled(cntx, Quotas.EXCHANGE2007_IMAPENABLED), - QuotaEnabled(cntx, Quotas.EXCHANGE2007_OWAENABLED), - QuotaEnabled(cntx, Quotas.EXCHANGE2007_MAPIENABLED), - QuotaEnabled(cntx, Quotas.EXCHANGE2007_ACTIVESYNCENABLED), - org.IssueWarningKB, - org.ProhibitSendKB, - org.ProhibitSendReceiveKB, - org.KeepDeletedItemsDays); + // string accountName = string.Empty; + //Create AD user if needed + if (accountId == 0) + { + accountId = OrganizationController.CreateUser(org.Id, displayName, name, domain, password, subscriberNumber, enabled, false, string.Empty, out accountName); + if (accountId > 0) + userCreated = true; + } + if (accountId < 0) + return accountId; - MailboxManagerActions pmmActions = MailboxManagerActions.GeneralSettings - | MailboxManagerActions.MailFlowSettings - | MailboxManagerActions.AdvancedSettings - | MailboxManagerActions.EmailAddresses; + // get mailbox settings + Organizations orgProxy = OrganizationController.GetOrganizationProxy(org.ServiceId); + OrganizationUser retUser = orgProxy.GetUserGeneralSettings(accountName, org.OrganizationId); - UpdateExchangeAccount(accountId, accountName, accountType, displayName, email, false, pmmActions.ToString(), samAccount, password); + int exchangeServiceId = PackageController.GetPackageServiceId(org.PackageId, ResourceGroups.Exchange); + + ExchangeServer exchange = GetExchangeServer(exchangeServiceId, org.ServiceId); + + + //Create Exchange Organization + if (string.IsNullOrEmpty(org.GlobalAddressList)) + { + ExtendToExchangeOrganization(ref org); + + PackageController.UpdatePackageItem(org); + } + + // check package + int packageCheck = SecurityContext.CheckPackage(org.PackageId, DemandPackage.IsActive); + if (packageCheck < 0) return packageCheck; + + //verify if the mailbox fits in the storage quota + // load package context + PackageContext cntx = PackageController.GetPackageContext(org.PackageId); + + int maxDiskSpace = -1; + int quotaUsed = 0; + if (cntx.Quotas.ContainsKey(Quotas.EXCHANGE2007_DISKSPACE) + && cntx.Quotas[Quotas.EXCHANGE2007_DISKSPACE].QuotaAllocatedValue > 0) + { + maxDiskSpace = cntx.Quotas[Quotas.EXCHANGE2007_DISKSPACE].QuotaAllocatedValue; + quotaUsed = cntx.Quotas[Quotas.EXCHANGE2007_DISKSPACE].QuotaUsedValue; + } + + ExchangeMailboxPlan plan = GetExchangeMailboxPlan(itemId, mailboxPlanId); + if (maxDiskSpace != -1) + { + if ((quotaUsed + plan.MailboxSizeMB) > (maxDiskSpace)) + return BusinessErrorCodes.ERROR_EXCHANGE_STORAGE_QUOTAS_EXCEED_HOST_VALUES; + } + + //GetServiceSettings + StringDictionary primSettings = ServerController.GetServiceSettings(exchangeServiceId); + + string samAccount = exchange.CreateMailEnableUser(email, org.OrganizationId, org.DistinguishedName, accountType, primSettings["mailboxdatabase"], + org.OfflineAddressBook, + org.AddressBookPolicy, + retUser.SamAccountName, + plan.EnablePOP, + plan.EnableIMAP, + plan.EnableOWA, + plan.EnableMAPI, + plan.EnableActiveSync, + (int)Math.Round((double)((plan.IssueWarningPct * plan.MailboxSizeMB * 1024) / 100)), + (int)Math.Round((double)((plan.ProhibitSendPct * plan.MailboxSizeMB * 1024) / 100)), + (int)Math.Round((double)((plan.ProhibitSendReceivePct * plan.MailboxSizeMB * 1024) / 100)), + plan.KeepDeletedItemsDays, + plan.MaxRecipients, + plan.MaxSendMessageSizeKB, + plan.MaxReceiveMessageSizeKB, + plan.HideFromAddressBook, + Convert.ToBoolean(cntx.Quotas[Quotas.EXCHANGE2007_ISCONSUMER].QuotaAllocatedValue)); + + MailboxManagerActions pmmActions = MailboxManagerActions.GeneralSettings + | MailboxManagerActions.MailFlowSettings + | MailboxManagerActions.AdvancedSettings + | MailboxManagerActions.EmailAddresses; + + + UpdateExchangeAccount(accountId, accountName, accountType, displayName, email, false, pmmActions.ToString(), samAccount, password, mailboxPlanId, subscriberNumber); - // send setup instructions - if (sendSetupInstructions) - { - try - { - // send setup instructions - int sendResult = SendMailboxSetupInstructions(itemId, accountId, true, setupInstructionMailAddress, null); - if (sendResult < 0) - TaskManager.WriteWarning("Setup instructions were not sent. Error code: " + sendResult); - } - catch (Exception ex) - { - TaskManager.WriteError(ex); - } - } + // send setup instructions + if (sendSetupInstructions) + { + try + { + // send setup instructions + int sendResult = SendMailboxSetupInstructions(itemId, accountId, true, setupInstructionMailAddress, null); + if (sendResult < 0) + TaskManager.WriteWarning("Setup instructions were not sent. Error code: " + sendResult); + } + catch (Exception ex) + { + TaskManager.WriteError(ex); + } + } - try - { - // update OAB - // check if this is the first mailbox within the organization - if (GetAccounts(itemId, ExchangeAccountType.Mailbox).Count == 1) - exchange.UpdateOrganizationOfflineAddressBook(org.OfflineAddressBook); - } - catch (Exception ex) - { - TaskManager.WriteError(ex); - } + try + { + // update OAB + // check if this is the first mailbox within the organization + if (GetAccounts(itemId, ExchangeAccountType.Mailbox).Count == 1) + exchange.UpdateOrganizationOfflineAddressBook(org.OfflineAddressBook); + } + catch (Exception ex) + { + TaskManager.WriteError(ex); + } - return accountId; - } - catch (Exception ex) - { - //rollback AD user - if (userCreated) - { - try - { - OrganizationController.DeleteUser(org.Id, accountId); - } - catch (Exception rollbackException) - { - TaskManager.WriteError(rollbackException); - } - } - throw TaskManager.WriteError(ex); + return accountId; + } + catch (Exception ex) + { + //rollback AD user + if (userCreated) + { + try + { + OrganizationController.DeleteUser(org.Id, accountId); + } + catch (Exception rollbackException) + { + TaskManager.WriteError(rollbackException); + } + } + throw TaskManager.WriteError(ex); - } - finally - { - TaskManager.CompleteTask(); - } - } + } + finally + { + TaskManager.CompleteTask(); + } + } public static int DisableMailbox(int itemId, int accountId) { @@ -1694,85 +1773,56 @@ namespace WebsitePanel.EnterpriseServer } } - public static int SetMailboxGeneralSettings(int itemId, int accountId, string displayName, - string password, bool hideAddressBook, bool disabled, string firstName, string initials, - string lastName, string address, string city, string state, string zip, string country, - string jobTitle, string company, string department, string office, string managerAccountName, - string businessPhone, string fax, string homePhone, string mobilePhone, string pager, - string webPage, string notes) - { - // check account - int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo | DemandAccount.IsActive); - if (accountCheck < 0) return accountCheck; + public static int SetMailboxGeneralSettings(int itemId, int accountId, bool hideAddressBook, bool disabled) + { + // check account + int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo | DemandAccount.IsActive); + if (accountCheck < 0) return accountCheck; - // place log record - TaskManager.StartTask("EXCHANGE", "UPDATE_MAILBOX_GENERAL"); - TaskManager.ItemId = itemId; + // place log record + TaskManager.StartTask("EXCHANGE", "UPDATE_MAILBOX_GENERAL"); + TaskManager.ItemId = itemId; - try - { - // load organization - Organization org = GetOrganization(itemId); - if (org == null) - return -1; + try + { + // load organization + Organization org = GetOrganization(itemId); + if (org == null) + return -1; - // check package - int packageCheck = SecurityContext.CheckPackage(org.PackageId, DemandPackage.IsActive); - if (packageCheck < 0) return packageCheck; + // check package + int packageCheck = SecurityContext.CheckPackage(org.PackageId, DemandPackage.IsActive); + if (packageCheck < 0) return packageCheck; - // load account - ExchangeAccount account = GetAccount(itemId, accountId); + // load account + ExchangeAccount account = GetAccount(itemId, accountId); - // get mailbox settings + // get mailbox settings int exchangeServiceId = GetExchangeServiceID(org.PackageId); ExchangeServer exchange = GetExchangeServer(exchangeServiceId, org.ServiceId); - - exchange.SetMailboxGeneralSettings( - account.AccountName, - displayName, - password, - hideAddressBook, - disabled, - firstName, - initials, - lastName, - address, - city, - state, - zip, - country, - jobTitle, - company, - department, - office, - managerAccountName, - businessPhone, - fax, - homePhone, - mobilePhone, - pager, - webPage, - notes); - // update account - account.DisplayName = displayName; - if (!String.IsNullOrEmpty(password)) - account.AccountPassword = CryptoUtils.Encrypt(password); + PackageContext cntx = PackageController.GetPackageContext(org.PackageId); - UpdateAccount(account); + if (Convert.ToBoolean(cntx.Quotas[Quotas.EXCHANGE2007_ISCONSUMER].QuotaAllocatedValue)) + hideAddressBook = true; - return 0; - } - catch (Exception ex) - { - throw TaskManager.WriteError(ex); - } - finally - { - TaskManager.CompleteTask(); - } - } + exchange.SetMailboxGeneralSettings( + account.AccountName, + hideAddressBook, + disabled); + + return 0; + } + catch (Exception ex) + { + throw TaskManager.WriteError(ex); + } + finally + { + TaskManager.CompleteTask(); + } + } public static ExchangeEmailAddress[] GetMailboxEmailAddresses(int itemId, int accountId) { @@ -2002,61 +2052,58 @@ namespace WebsitePanel.EnterpriseServer } } - public static int SetMailboxMailFlowSettings(int itemId, int accountId, - bool enableForwarding, string forwardingAccountName, bool forwardToBoth, - string[] sendOnBehalfAccounts, string[] acceptAccounts, string[] rejectAccounts, - int maxRecipients, int maxSendMessageSizeKB, int maxReceiveMessageSizeKB, + public static int SetMailboxMailFlowSettings(int itemId, int accountId, + bool enableForwarding, string forwardingAccountName, bool forwardToBoth, + string[] sendOnBehalfAccounts, string[] acceptAccounts, string[] rejectAccounts, bool requireSenderAuthentication) - { - // check account - int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo | DemandAccount.IsActive); - if (accountCheck < 0) return accountCheck; + { + // check account + int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo | DemandAccount.IsActive); + if (accountCheck < 0) return accountCheck; - // place log record - TaskManager.StartTask("EXCHANGE", "UPDATE_MAILBOX_MAILFLOW"); - TaskManager.ItemId = itemId; + // place log record + TaskManager.StartTask("EXCHANGE", "UPDATE_MAILBOX_MAILFLOW"); + TaskManager.ItemId = itemId; - try - { - // load organization - Organization org = GetOrganization(itemId); - if (org == null) - return -1; + try + { + // load organization + Organization org = GetOrganization(itemId); + if (org == null) + return -1; - // check package - int packageCheck = SecurityContext.CheckPackage(org.PackageId, DemandPackage.IsActive); - if (packageCheck < 0) return packageCheck; + // check package + int packageCheck = SecurityContext.CheckPackage(org.PackageId, DemandPackage.IsActive); + if (packageCheck < 0) return packageCheck; - // load account - ExchangeAccount account = GetAccount(itemId, accountId); + // load account + ExchangeAccount account = GetAccount(itemId, accountId); - // get mailbox settings + // get mailbox settings int exchangeServiceId = GetExchangeServiceID(org.PackageId); ExchangeServer exchange = GetExchangeServer(exchangeServiceId, org.ServiceId); - - exchange.SetMailboxMailFlowSettings(account.AccountName, - enableForwarding, - forwardingAccountName, - forwardToBoth, - sendOnBehalfAccounts, - acceptAccounts, - rejectAccounts, - maxRecipients, - maxSendMessageSizeKB, - maxReceiveMessageSizeKB, - requireSenderAuthentication); - return 0; - } - catch (Exception ex) - { - throw TaskManager.WriteError(ex); - } - finally - { - TaskManager.CompleteTask(); - } - } + exchange.SetMailboxMailFlowSettings(account.AccountName, + enableForwarding, + forwardingAccountName, + forwardToBoth, + sendOnBehalfAccounts, + acceptAccounts, + rejectAccounts, + requireSenderAuthentication); + + return 0; + } + catch (Exception ex) + { + throw TaskManager.WriteError(ex); + } + finally + { + TaskManager.CompleteTask(); + } + } + public static ExchangeMailbox GetMailboxAdvancedSettings(int itemId, int accountId) { @@ -2098,75 +2145,6 @@ namespace WebsitePanel.EnterpriseServer } } - public static int SetMailboxAdvancedSettings(int itemId, int accountId, bool enablePOP, - bool enableIMAP, bool enableOWA, bool enableMAPI, bool enableActiveSync, - int issueWarningKB, int prohibitSendKB, int prohibitSendReceiveKB, int keepDeletedItemsDays) - { - // check account - int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo | DemandAccount.IsActive); - if (accountCheck < 0) return accountCheck; - - // place log record - TaskManager.StartTask("EXCHANGE", "UPDATE_MAILBOX_ADVANCED"); - TaskManager.ItemId = itemId; - - try - { - // load organization - Organization org = GetOrganization(itemId); - if (org == null) - return -1; - - // check package - int packageCheck = SecurityContext.CheckPackage(org.PackageId, DemandPackage.IsActive); - if (packageCheck < 0) return packageCheck; - - // load account - ExchangeAccount account = GetAccount(itemId, accountId); - - // load package context - PackageContext cntx = PackageController.GetPackageContext(org.PackageId); - - int maxDiskSpace = 0; - if (cntx.Quotas.ContainsKey(Quotas.EXCHANGE2007_DISKSPACE) - && cntx.Quotas[Quotas.EXCHANGE2007_DISKSPACE].QuotaAllocatedValue > 0) - maxDiskSpace = cntx.Quotas[Quotas.EXCHANGE2007_DISKSPACE].QuotaAllocatedValue * 1024; - - if ((maxDiskSpace > 0 && - (issueWarningKB > maxDiskSpace - || prohibitSendKB > maxDiskSpace - || prohibitSendReceiveKB > maxDiskSpace || issueWarningKB == -1 || prohibitSendKB == -1 || prohibitSendReceiveKB == -1))) - return BusinessErrorCodes.ERROR_EXCHANGE_STORAGE_QUOTAS_EXCEED_HOST_VALUES; - - // get mailbox settings - int exchangeServiceId = GetExchangeServiceID(org.PackageId); - ExchangeServer exchange = GetExchangeServer(exchangeServiceId, org.ServiceId); - - exchange.SetMailboxAdvancedSettings( - org.OrganizationId, - account.AccountName, - QuotaEnabled(cntx, Quotas.EXCHANGE2007_POP3ALLOWED) && enablePOP, - QuotaEnabled(cntx, Quotas.EXCHANGE2007_IMAPALLOWED) && enableIMAP, - QuotaEnabled(cntx, Quotas.EXCHANGE2007_OWAALLOWED) && enableOWA, - QuotaEnabled(cntx, Quotas.EXCHANGE2007_MAPIALLOWED) && enableMAPI, - QuotaEnabled(cntx, Quotas.EXCHANGE2007_ACTIVESYNCALLOWED) && enableActiveSync, - issueWarningKB, - prohibitSendKB, - prohibitSendReceiveKB, - keepDeletedItemsDays); - - return 0; - } - catch (Exception ex) - { - throw TaskManager.WriteError(ex); - } - finally - { - TaskManager.CompleteTask(); - } - } - public static int SetMailboxManagerSettings(int itemId, int accountId, bool pmmAllowed, MailboxManagerActions action) { // check account @@ -2421,44 +2399,266 @@ namespace WebsitePanel.EnterpriseServer #endregion - #region Contacts - public static int CreateContact(int itemId, string displayName, string email) + + #region Mailbox plan + public static int SetExchangeMailboxPlan(int itemId, int accountId, int mailboxPlanId) + { + // check account + int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo | DemandAccount.IsActive); + if (accountCheck < 0) return accountCheck; + + // place log record + TaskManager.StartTask("EXCHANGE", "SET_MAILBOXPLAN"); + TaskManager.ItemId = itemId; + + try + { + // load organization + Organization org = GetOrganization(itemId); + if (org == null) + return -1; + + // check package + int packageCheck = SecurityContext.CheckPackage(org.PackageId, DemandPackage.IsActive); + if (packageCheck < 0) return packageCheck; + + // load account + ExchangeAccount account = GetAccount(itemId, accountId); + + // load package context + PackageContext cntx = PackageController.GetPackageContext(org.PackageId); + + int maxDiskSpace = -1; + int quotaUsed = 0; + if (cntx.Quotas.ContainsKey(Quotas.EXCHANGE2007_DISKSPACE) + && cntx.Quotas[Quotas.EXCHANGE2007_DISKSPACE].QuotaAllocatedValue > 0) + { + maxDiskSpace = cntx.Quotas[Quotas.EXCHANGE2007_DISKSPACE].QuotaAllocatedValue; + quotaUsed = cntx.Quotas[Quotas.EXCHANGE2007_DISKSPACE].QuotaUsedValue; + } + + ExchangeMailboxPlan plan = GetExchangeMailboxPlan(itemId, mailboxPlanId); + if (maxDiskSpace != -1) + { + if ((quotaUsed + plan.MailboxSizeMB) > (maxDiskSpace)) + return BusinessErrorCodes.ERROR_EXCHANGE_STORAGE_QUOTAS_EXCEED_HOST_VALUES; + } + + // get mailbox settings + int exchangeServiceId = GetExchangeServiceID(org.PackageId); + ExchangeServer exchange = GetExchangeServer(exchangeServiceId, org.ServiceId); + + exchange.SetMailboxAdvancedSettings( + org.OrganizationId, + account.AccountName, + plan.EnablePOP, + plan.EnableIMAP, + plan.EnableOWA, + plan.EnableMAPI, + plan.EnableActiveSync, + (int)Math.Round((double)((plan.IssueWarningPct * plan.MailboxSizeMB * 1024) / 100)), + (int)Math.Round((double)((plan.ProhibitSendPct * plan.MailboxSizeMB * 1024) / 100)), + (int)Math.Round((double)((plan.ProhibitSendReceivePct * plan.MailboxSizeMB * 1024) / 100)), + plan.KeepDeletedItemsDays, + plan.MaxRecipients, + plan.MaxSendMessageSizeKB, + plan.MaxReceiveMessageSizeKB); + + DataProvider.SetExchangeAccountMailboxPlan(accountId, mailboxPlanId); + + return 0; + } + catch (Exception ex) + { + throw TaskManager.WriteError(ex); + } + finally + { + TaskManager.CompleteTask(); + } + } + + public static List GetExchangeMailboxPlans(int itemId) + { + // place log record + TaskManager.StartTask("EXCHANGE", "GET_EXCHANGE_MAILBOXPLANS"); + TaskManager.ItemId = itemId; + + try + { + return ObjectUtils.CreateListFromDataReader( + DataProvider.GetExchangeMailboxPlans(itemId)); + } + catch (Exception ex) + { + throw TaskManager.WriteError(ex); + } + finally + { + TaskManager.CompleteTask(); + } + } + + public static ExchangeMailboxPlan GetExchangeMailboxPlan(int itemID, int mailboxPlanId) + { + + // place log record + TaskManager.StartTask("EXCHANGE", "GET_EXCHANGE_MAILBOXPLAN"); + TaskManager.ItemId = mailboxPlanId; + + try + { + return ObjectUtils.FillObjectFromDataReader( + DataProvider.GetExchangeMailboxPlan(mailboxPlanId)); + } + catch (Exception ex) + { + throw TaskManager.WriteError(ex); + } + finally + { + TaskManager.CompleteTask(); + } + } + + public static int AddExchangeMailboxPlan(int itemID, ExchangeMailboxPlan mailboxPlan) + { + // place log record + TaskManager.StartTask("EXCHANGE", "ADD_EXCHANGE_MAILBOXPLAN"); + TaskManager.ItemId = itemID; + + try + { + Organization org = GetOrganization(itemID); + if (org == null) + return -1; + + // load package context + PackageContext cntx = PackageController.GetPackageContext(org.PackageId); + + mailboxPlan.EnableActiveSync = mailboxPlan.EnableActiveSync & Convert.ToBoolean(cntx.Quotas[Quotas.EXCHANGE2007_ACTIVESYNCALLOWED].QuotaAllocatedValue); + mailboxPlan.EnableIMAP = mailboxPlan.EnableIMAP & Convert.ToBoolean(cntx.Quotas[Quotas.EXCHANGE2007_IMAPALLOWED].QuotaAllocatedValue); + mailboxPlan.EnableMAPI = mailboxPlan.EnableMAPI & Convert.ToBoolean(cntx.Quotas[Quotas.EXCHANGE2007_MAPIALLOWED].QuotaAllocatedValue); + mailboxPlan.EnableOWA = mailboxPlan.EnableOWA & Convert.ToBoolean(cntx.Quotas[Quotas.EXCHANGE2007_OWAALLOWED].QuotaAllocatedValue); + mailboxPlan.EnablePOP = mailboxPlan.EnablePOP & Convert.ToBoolean(cntx.Quotas[Quotas.EXCHANGE2007_POP3ALLOWED].QuotaAllocatedValue); + if (mailboxPlan.KeepDeletedItemsDays > cntx.Quotas[Quotas.EXCHANGE2007_KEEPDELETEDITEMSDAYS].QuotaAllocatedValue) + mailboxPlan.KeepDeletedItemsDays = cntx.Quotas[Quotas.EXCHANGE2007_KEEPDELETEDITEMSDAYS].QuotaAllocatedValue; + if (cntx.Quotas[Quotas.EXCHANGE2007_DISKSPACE].QuotaAllocatedValue != -1) + if (mailboxPlan.MailboxSizeMB > cntx.Quotas[Quotas.EXCHANGE2007_DISKSPACE].QuotaAllocatedValue) + mailboxPlan.MailboxSizeMB = cntx.Quotas[Quotas.EXCHANGE2007_DISKSPACE].QuotaAllocatedValue; + if (mailboxPlan.MaxReceiveMessageSizeKB > cntx.Quotas[Quotas.EXCHANGE2007_MAXRECEIVEMESSAGESIZEKB].QuotaAllocatedValue) + mailboxPlan.MaxReceiveMessageSizeKB = cntx.Quotas[Quotas.EXCHANGE2007_MAXRECEIVEMESSAGESIZEKB].QuotaAllocatedValue; + if (mailboxPlan.MaxSendMessageSizeKB > cntx.Quotas[Quotas.EXCHANGE2007_MAXSENDMESSAGESIZEKB].QuotaAllocatedValue) + mailboxPlan.MaxSendMessageSizeKB = cntx.Quotas[Quotas.EXCHANGE2007_MAXSENDMESSAGESIZEKB].QuotaAllocatedValue; + if (cntx.Quotas[Quotas.EXCHANGE2007_MAXRECIPIENTS].QuotaAllocatedValue != -1) + if (mailboxPlan.MaxRecipients > cntx.Quotas[Quotas.EXCHANGE2007_MAXRECIPIENTS].QuotaAllocatedValue) + mailboxPlan.MaxRecipients = cntx.Quotas[Quotas.EXCHANGE2007_MAXRECIPIENTS].QuotaAllocatedValue; + if (Convert.ToBoolean(cntx.Quotas[Quotas.EXCHANGE2007_ISCONSUMER].QuotaAllocatedValue)) mailboxPlan.HideFromAddressBook = true; + + return DataProvider.AddExchangeMailboxPlan(itemID, mailboxPlan.MailboxPlan, mailboxPlan.EnableActiveSync, mailboxPlan.EnableIMAP, mailboxPlan.EnableMAPI, mailboxPlan.EnableOWA, mailboxPlan.EnablePOP, + mailboxPlan.IsDefault, mailboxPlan.IssueWarningPct, mailboxPlan.KeepDeletedItemsDays, mailboxPlan.MailboxSizeMB, mailboxPlan.MaxReceiveMessageSizeKB, mailboxPlan.MaxRecipients, + mailboxPlan.MaxSendMessageSizeKB, mailboxPlan.ProhibitSendPct, mailboxPlan.ProhibitSendReceivePct, mailboxPlan.HideFromAddressBook); + } + catch (Exception ex) + { + throw TaskManager.WriteError(ex); + } + finally + { + TaskManager.CompleteTask(); + } + + } + + public static int DeleteExchangeMailboxPlan(int itemID, int mailboxPlanId) + { + TaskManager.StartTask("EXCHANGE", "DELETE_EXCHANGE_MAILBOXPLAN"); + TaskManager.ItemId = itemID; + + try + { + DataProvider.DeleteExchangeMailboxPlan(mailboxPlanId); + + return 0; + } + catch (Exception ex) + { + throw TaskManager.WriteError(ex); + } + finally + { + TaskManager.CompleteTask(); + } + + } + + public static void SetOrganizationDefaultExchangeMailboxPlan(int itemId, int mailboxPlanId) + { + TaskManager.StartTask("EXCHANGE", "SET_EXCHANGE_MAILBOXPLAN"); + TaskManager.ItemId = itemId; + + try + { + DataProvider.SetOrganizationDefaultExchangeMailboxPlan(itemId, mailboxPlanId); + } + catch (Exception ex) + { + throw TaskManager.WriteError(ex); + } + finally + { + TaskManager.CompleteTask(); + } + + } + + + + #endregion + + + #region Contacts + public static int CreateContact(int itemId, string displayName, string email) { //if (EmailAddressExists(email)) - // return BusinessErrorCodes.ERROR_EXCHANGE_EMAIL_EXISTS; - + // return BusinessErrorCodes.ERROR_EXCHANGE_EMAIL_EXISTS; + // check account - int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo | DemandAccount.IsActive); - if (accountCheck < 0) return accountCheck; + int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo | DemandAccount.IsActive); + if (accountCheck < 0) return accountCheck; // check mailbox quota - OrganizationStatistics orgStats = GetOrganizationStatistics(itemId); - if (orgStats.AllocatedContacts > -1 - && orgStats.CreatedContacts >= orgStats.AllocatedContacts) - return BusinessErrorCodes.ERROR_EXCHANGE_CONTACTS_QUOTA_LIMIT; + OrganizationStatistics orgStats = GetOrganizationStatistics(itemId); + if (orgStats.AllocatedContacts > -1 + && orgStats.CreatedContacts >= orgStats.AllocatedContacts) + return BusinessErrorCodes.ERROR_EXCHANGE_CONTACTS_QUOTA_LIMIT; - // place log record - TaskManager.StartTask("EXCHANGE", "CREATE_CONTACT"); - TaskManager.ItemId = itemId; + // place log record + TaskManager.StartTask("EXCHANGE", "CREATE_CONTACT"); + TaskManager.ItemId = itemId; - try - { - // load organization - Organization org = GetOrganization(itemId); + try + { - // check package - int packageCheck = SecurityContext.CheckPackage(org.PackageId, DemandPackage.IsActive); - if (packageCheck < 0) return packageCheck; + displayName = displayName.Trim(); + email = email.Trim(); - string name = email; - int idx = email.IndexOf("@"); - if (idx > -1) - name = email.Substring(0, idx); + // load organization + Organization org = GetOrganization(itemId); - string accountName = BuildAccountName(org.OrganizationId, name); + // check package + int packageCheck = SecurityContext.CheckPackage(org.PackageId, DemandPackage.IsActive); + if (packageCheck < 0) return packageCheck; - // add contact + string name = email; + int idx = email.IndexOf("@"); + if (idx > -1) + name = email.Substring(0, idx); + + string accountName = BuildAccountName(org.OrganizationId, name); + + // add contact int exchangeServiceId = GetExchangeServiceID(org.PackageId); ExchangeServer exchange = GetExchangeServer(exchangeServiceId, org.ServiceId); @@ -2469,30 +2669,32 @@ namespace WebsitePanel.EnterpriseServer PackageController.UpdatePackageItem(org); } - + exchange.CreateContact( - org.OrganizationId, - org.DistinguishedName, - displayName, - accountName, + org.OrganizationId, + org.DistinguishedName, + displayName, + accountName, email, org.DefaultDomain); - // add meta-item - int accountId = AddAccount(itemId, ExchangeAccountType.Contact, accountName, - displayName, email, false, - 0, "", null); + ExchangeContact contact = exchange.GetContactGeneralSettings(accountName); - return accountId; - } - catch (Exception ex) - { - throw TaskManager.WriteError(ex); - } - finally - { - TaskManager.CompleteTask(); - } - } + // add meta-item + int accountId = AddAccount(itemId, ExchangeAccountType.Contact, accountName, + displayName, email, false, + 0, contact.SAMAccountName, null, 0, null); + + return accountId; + } + catch (Exception ex) + { + throw TaskManager.WriteError(ex); + } + finally + { + TaskManager.CompleteTask(); + } + } public static int DeleteContact(int itemId, int accountId) { @@ -2593,75 +2795,80 @@ namespace WebsitePanel.EnterpriseServer string businessPhone, string fax, string homePhone, string mobilePhone, string pager, string webPage, string notes, int useMapiRichTextFormat) { - // check account - int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo | DemandAccount.IsActive); - if (accountCheck < 0) return accountCheck; + // check account + int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo | DemandAccount.IsActive); + if (accountCheck < 0) return accountCheck; - // place log record - TaskManager.StartTask("EXCHANGE", "UPDATE_CONTACT_GENERAL"); - TaskManager.ItemId = itemId; + // place log record + TaskManager.StartTask("EXCHANGE", "UPDATE_CONTACT_GENERAL"); + TaskManager.ItemId = itemId; - try - { - // load organization - Organization org = GetOrganization(itemId); - if (org == null) - return -1; + try + { + displayName = displayName.Trim(); + emailAddress = emailAddress.Trim(); + firstName = firstName.Trim(); + lastName = lastName.Trim(); - // check package - int packageCheck = SecurityContext.CheckPackage(org.PackageId, DemandPackage.IsActive); - if (packageCheck < 0) return packageCheck; + // load organization + Organization org = GetOrganization(itemId); + if (org == null) + return -1; - // load account - ExchangeAccount account = GetAccount(itemId, accountId); + // check package + int packageCheck = SecurityContext.CheckPackage(org.PackageId, DemandPackage.IsActive); + if (packageCheck < 0) return packageCheck; - // get mailbox settings + // load account + ExchangeAccount account = GetAccount(itemId, accountId); + + // get mailbox settings int exchangeServiceId = GetExchangeServiceID(org.PackageId); ExchangeServer exchange = GetExchangeServer(exchangeServiceId, org.ServiceId); - - exchange.SetContactGeneralSettings( - account.AccountName, - displayName, - emailAddress, - hideAddressBook, - firstName, - initials, - lastName, - address, - city, - state, - zip, - country, - jobTitle, - company, - department, - office, - managerAccountName, - businessPhone, - fax, - homePhone, - mobilePhone, - pager, - webPage, - notes, + + exchange.SetContactGeneralSettings( + account.AccountName, + displayName, + emailAddress, + hideAddressBook, + firstName, + initials, + lastName, + address, + city, + state, + zip, + country, + jobTitle, + company, + department, + office, + managerAccountName, + businessPhone, + fax, + homePhone, + mobilePhone, + pager, + webPage, + notes, useMapiRichTextFormat, org.DefaultDomain); - // update account - account.DisplayName = displayName; - account.PrimaryEmailAddress = emailAddress; - UpdateAccount(account); + // update account + account.DisplayName = displayName; + account.PrimaryEmailAddress = emailAddress; + UpdateAccount(account); - return 0; - } - catch (Exception ex) - { - throw TaskManager.WriteError(ex); - } - finally - { - TaskManager.CompleteTask(); - } - } + return 0; + } + catch (Exception ex) + { + throw TaskManager.WriteError(ex); + } + finally + { + TaskManager.CompleteTask(); + } + } public static ExchangeContact GetContactMailFlowSettings(int itemId, int accountId) { @@ -2754,40 +2961,44 @@ namespace WebsitePanel.EnterpriseServer #region Distribution Lists public static int CreateDistributionList(int itemId, string displayName, string name, string domain, int managerId) { - // check account - int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo | DemandAccount.IsActive); - if (accountCheck < 0) return accountCheck; + // check account + int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo | DemandAccount.IsActive); + if (accountCheck < 0) return accountCheck; - // check mailbox quota - OrganizationStatistics orgStats = GetOrganizationStatistics(itemId); - if (orgStats.AllocatedDistributionLists > -1 - && orgStats.CreatedDistributionLists >= orgStats.AllocatedDistributionLists) - return BusinessErrorCodes.ERROR_EXCHANGE_DLISTS_QUOTA_LIMIT; + // check mailbox quota + OrganizationStatistics orgStats = GetOrganizationStatistics(itemId); + if (orgStats.AllocatedDistributionLists > -1 + && orgStats.CreatedDistributionLists >= orgStats.AllocatedDistributionLists) + return BusinessErrorCodes.ERROR_EXCHANGE_DLISTS_QUOTA_LIMIT; - // place log record - TaskManager.StartTask("EXCHANGE", "CREATE_DISTR_LIST"); - TaskManager.ItemId = itemId; + // place log record + TaskManager.StartTask("EXCHANGE", "CREATE_DISTR_LIST"); + TaskManager.ItemId = itemId; - try - { - // e-mail - string email = name + "@" + domain; + try + { + displayName = displayName.Trim(); + name = name.Trim(); + domain = domain.Trim(); - // check e-mail - if (EmailAddressExists(email)) - return BusinessErrorCodes.ERROR_EXCHANGE_EMAIL_EXISTS; + // e-mail + string email = name + "@" + domain; - // load organization - Organization org = GetOrganization(itemId); + // check e-mail + if (EmailAddressExists(email)) + return BusinessErrorCodes.ERROR_EXCHANGE_EMAIL_EXISTS; - // check package - int packageCheck = SecurityContext.CheckPackage(org.PackageId, DemandPackage.IsActive); - if (packageCheck < 0) return packageCheck; + // load organization + Organization org = GetOrganization(itemId); - string accountName = BuildAccountName(org.OrganizationId, name); + // check package + int packageCheck = SecurityContext.CheckPackage(org.PackageId, DemandPackage.IsActive); + if (packageCheck < 0) return packageCheck; - // add account - // add contact + string accountName = BuildAccountName(org.OrganizationId, name); + + // add account + // add contact int exchangeServiceId = GetExchangeServiceID(org.PackageId); ExchangeServer exchange = GetExchangeServer(exchangeServiceId, org.ServiceId); @@ -2799,34 +3010,41 @@ namespace WebsitePanel.EnterpriseServer PackageController.UpdatePackageItem(org); } - OrganizationUser manager = OrganizationController.GetAccount(itemId, managerId); - exchange.CreateDistributionList( - org.OrganizationId, - org.DistinguishedName, - displayName, - accountName, - name, - domain, manager.AccountName); + OrganizationUser manager = OrganizationController.GetAccount(itemId, managerId); - // add meta-item - int accountId = AddAccount(itemId, ExchangeAccountType.DistributionList, accountName, - displayName, email, false, - 0, "", null); + List addressLists = new List(); + addressLists.Add(org.GlobalAddressList); + addressLists.Add(org.AddressList); - // register email address - AddAccountEmailAddress(accountId, email); + exchange.CreateDistributionList( + org.OrganizationId, + org.DistinguishedName, + displayName, + accountName, + name, + domain, manager.AccountName, addressLists.ToArray()); - return accountId; - } - catch (Exception ex) - { - throw TaskManager.WriteError(ex); - } - finally - { - TaskManager.CompleteTask(); - } - } + ExchangeDistributionList dl = exchange.GetDistributionListGeneralSettings(accountName); + + // add meta-item + int accountId = AddAccount(itemId, ExchangeAccountType.DistributionList, email, + displayName, email, false, + 0, dl.SAMAccountName, null, 0, null); + + // register email address + AddAccountEmailAddress(accountId, email); + + return accountId; + } + catch (Exception ex) + { + throw TaskManager.WriteError(ex); + } + finally + { + TaskManager.CompleteTask(); + } + } public static int DeleteDistributionList(int itemId, int accountId) { @@ -2923,55 +3141,62 @@ namespace WebsitePanel.EnterpriseServer bool hideAddressBook, string managerAccount, string[] memberAccounts, string notes) { - // check account - int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo | DemandAccount.IsActive); - if (accountCheck < 0) return accountCheck; + // check account + int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo | DemandAccount.IsActive); + if (accountCheck < 0) return accountCheck; - // place log record - TaskManager.StartTask("EXCHANGE", "UPDATE_DISTR_LIST_GENERAL"); - TaskManager.ItemId = itemId; + // place log record + TaskManager.StartTask("EXCHANGE", "UPDATE_DISTR_LIST_GENERAL"); + TaskManager.ItemId = itemId; - try - { - // load organization - Organization org = GetOrganization(itemId); - if (org == null) - return -1; + try + { + displayName = displayName.Trim(); - // check package - int packageCheck = SecurityContext.CheckPackage(org.PackageId, DemandPackage.IsActive); - if (packageCheck < 0) return packageCheck; + // load organization + Organization org = GetOrganization(itemId); + if (org == null) + return -1; - // load account - ExchangeAccount account = GetAccount(itemId, accountId); + // check package + int packageCheck = SecurityContext.CheckPackage(org.PackageId, DemandPackage.IsActive); + if (packageCheck < 0) return packageCheck; - // get mailbox settings + // load account + ExchangeAccount account = GetAccount(itemId, accountId); + + // get mailbox settings int exchangeServiceId = GetExchangeServiceID(org.PackageId); ExchangeServer exchange = GetExchangeServer(exchangeServiceId, org.ServiceId); - - exchange.SetDistributionListGeneralSettings( - account.AccountName, - displayName, - hideAddressBook, - managerAccount, - memberAccounts, - notes); - // update account - account.DisplayName = displayName; - UpdateAccount(account); + List addressLists = new List(); + addressLists.Add(org.GlobalAddressList); + addressLists.Add(org.AddressList); - return 0; - } - catch (Exception ex) - { - throw TaskManager.WriteError(ex); - } - finally - { - TaskManager.CompleteTask(); - } - } + exchange.SetDistributionListGeneralSettings( + account.AccountName, + displayName, + hideAddressBook, + managerAccount, + memberAccounts, + notes, + addressLists.ToArray()); + + // update account + account.DisplayName = displayName; + UpdateAccount(account); + + return 0; + } + catch (Exception ex) + { + throw TaskManager.WriteError(ex); + } + finally + { + TaskManager.CompleteTask(); + } + } public static ExchangeDistributionList GetDistributionListMailFlowSettings(int itemId, int accountId) { @@ -3017,48 +3242,54 @@ namespace WebsitePanel.EnterpriseServer public static int SetDistributionListMailFlowSettings(int itemId, int accountId, string[] acceptAccounts, string[] rejectAccounts, bool requireSenderAuthentication) { - // check account - int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo | DemandAccount.IsActive); - if (accountCheck < 0) return accountCheck; + // check account + int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo | DemandAccount.IsActive); + if (accountCheck < 0) return accountCheck; - // place log record - TaskManager.StartTask("EXCHANGE", "UPDATE_DISTR_LIST_MAILFLOW"); - TaskManager.ItemId = itemId; + // place log record + TaskManager.StartTask("EXCHANGE", "UPDATE_DISTR_LIST_MAILFLOW"); + TaskManager.ItemId = itemId; - try - { - // load organization - Organization org = GetOrganization(itemId); - if (org == null) - return -1; + try + { + // load organization + Organization org = GetOrganization(itemId); + if (org == null) + return -1; - // check package - int packageCheck = SecurityContext.CheckPackage(org.PackageId, DemandPackage.IsActive); - if (packageCheck < 0) return packageCheck; + // check package + int packageCheck = SecurityContext.CheckPackage(org.PackageId, DemandPackage.IsActive); + if (packageCheck < 0) return packageCheck; - // load account - ExchangeAccount account = GetAccount(itemId, accountId); + // load account + ExchangeAccount account = GetAccount(itemId, accountId); - // get mailbox settings + // get mailbox settings int exchangeServiceId = GetExchangeServiceID(org.PackageId); ExchangeServer exchange = GetExchangeServer(exchangeServiceId, org.ServiceId); - - exchange.SetDistributionListMailFlowSettings(account.AccountName, - acceptAccounts, - rejectAccounts, - requireSenderAuthentication); - return 0; - } - catch (Exception ex) - { - throw TaskManager.WriteError(ex); - } - finally - { - TaskManager.CompleteTask(); - } - } + List addressLists = new List(); + addressLists.Add(org.GlobalAddressList); + addressLists.Add(org.AddressList); + + + exchange.SetDistributionListMailFlowSettings(account.AccountName, + acceptAccounts, + rejectAccounts, + requireSenderAuthentication, + addressLists.ToArray()); + + return 0; + } + catch (Exception ex) + { + throw TaskManager.WriteError(ex); + } + finally + { + TaskManager.CompleteTask(); + } + } public static ExchangeEmailAddress[] GetDistributionListEmailAddresses(int itemId, int accountId) { @@ -3082,152 +3313,165 @@ namespace WebsitePanel.EnterpriseServer public static int AddDistributionListEmailAddress(int itemId, int accountId, string emailAddress) { - // check account - int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo | DemandAccount.IsActive); - if (accountCheck < 0) return accountCheck; + // check account + int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo | DemandAccount.IsActive); + if (accountCheck < 0) return accountCheck; - // place log record - TaskManager.StartTask("EXCHANGE", "ADD_DISTR_LIST_ADDRESS"); - TaskManager.ItemId = itemId; + // place log record + TaskManager.StartTask("EXCHANGE", "ADD_DISTR_LIST_ADDRESS"); + TaskManager.ItemId = itemId; - try - { - // check - if (EmailAddressExists(emailAddress)) - return BusinessErrorCodes.ERROR_EXCHANGE_EMAIL_EXISTS; + try + { + // check + if (EmailAddressExists(emailAddress)) + return BusinessErrorCodes.ERROR_EXCHANGE_EMAIL_EXISTS; - // load organization - Organization org = GetOrganization(itemId); - if (org == null) - return -1; + // load organization + Organization org = GetOrganization(itemId); + if (org == null) + return -1; - // check package - int packageCheck = SecurityContext.CheckPackage(org.PackageId, DemandPackage.IsActive); - if (packageCheck < 0) return packageCheck; + // check package + int packageCheck = SecurityContext.CheckPackage(org.PackageId, DemandPackage.IsActive); + if (packageCheck < 0) return packageCheck; - // load account - ExchangeAccount account = GetAccount(itemId, accountId); + // load account + ExchangeAccount account = GetAccount(itemId, accountId); - // add e-mail - AddAccountEmailAddress(accountId, emailAddress); + // add e-mail + AddAccountEmailAddress(accountId, emailAddress); - // update e-mail addresses + // update e-mail addresses int exchangeServiceId = GetExchangeServiceID(org.PackageId); ExchangeServer exchange = GetExchangeServer(exchangeServiceId, org.ServiceId); - - exchange.SetDistributionListEmailAddresses( - account.AccountName, - GetAccountSimpleEmailAddresses(itemId, accountId)); - return 0; - } - catch (Exception ex) - { - throw TaskManager.WriteError(ex); - } - finally - { - TaskManager.CompleteTask(); - } - } + List addressLists = new List(); + addressLists.Add(org.GlobalAddressList); + addressLists.Add(org.AddressList); + + exchange.SetDistributionListEmailAddresses( + account.AccountName, + GetAccountSimpleEmailAddresses(itemId, accountId), addressLists.ToArray()); + + return 0; + } + catch (Exception ex) + { + throw TaskManager.WriteError(ex); + } + finally + { + TaskManager.CompleteTask(); + } + } public static int SetDistributionListPrimaryEmailAddress(int itemId, int accountId, string emailAddress) { - // check account - int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo | DemandAccount.IsActive); - if (accountCheck < 0) return accountCheck; + // check account + int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo | DemandAccount.IsActive); + if (accountCheck < 0) return accountCheck; - // place log record - TaskManager.StartTask("EXCHANGE", "SET_PRIMARY_DISTR_LIST_ADDRESS"); - TaskManager.ItemId = itemId; + // place log record + TaskManager.StartTask("EXCHANGE", "SET_PRIMARY_DISTR_LIST_ADDRESS"); + TaskManager.ItemId = itemId; - try - { - // get account - ExchangeAccount account = GetAccount(itemId, accountId); - account.PrimaryEmailAddress = emailAddress; + try + { + // get account + ExchangeAccount account = GetAccount(itemId, accountId); + account.PrimaryEmailAddress = emailAddress; - // update exchange - Organization org = GetOrganization(itemId); - if (org == null) - return -1; + // update exchange + Organization org = GetOrganization(itemId); + if (org == null) + return -1; - // check package - int packageCheck = SecurityContext.CheckPackage(org.PackageId, DemandPackage.IsActive); - if (packageCheck < 0) return packageCheck; + // check package + int packageCheck = SecurityContext.CheckPackage(org.PackageId, DemandPackage.IsActive); + if (packageCheck < 0) return packageCheck; int exchangeServiceId = GetExchangeServiceID(org.PackageId); ExchangeServer exchange = GetExchangeServer(exchangeServiceId, org.ServiceId); - - exchange.SetDistributionListPrimaryEmailAddress( - account.AccountName, - emailAddress); - // save account - UpdateAccount(account); + List addressLists = new List(); + addressLists.Add(org.GlobalAddressList); + addressLists.Add(org.AddressList); - return 0; - } - catch (Exception ex) - { - throw TaskManager.WriteError(ex); - } - finally - { - TaskManager.CompleteTask(); - } - } + exchange.SetDistributionListPrimaryEmailAddress( + account.AccountName, + emailAddress, + addressLists.ToArray()); + + // save account + UpdateAccount(account); + + return 0; + } + catch (Exception ex) + { + throw TaskManager.WriteError(ex); + } + finally + { + TaskManager.CompleteTask(); + } + } public static int DeleteDistributionListEmailAddresses(int itemId, int accountId, string[] emailAddresses) { - // check account - int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo | DemandAccount.IsActive); - if (accountCheck < 0) return accountCheck; + // check account + int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo | DemandAccount.IsActive); + if (accountCheck < 0) return accountCheck; - // place log record - TaskManager.StartTask("EXCHANGE", "DELETE_DISTR_LIST_ADDRESSES"); - TaskManager.ItemId = itemId; + // place log record + TaskManager.StartTask("EXCHANGE", "DELETE_DISTR_LIST_ADDRESSES"); + TaskManager.ItemId = itemId; - try - { - // get account - ExchangeAccount account = GetAccount(itemId, accountId); + try + { + // get account + ExchangeAccount account = GetAccount(itemId, accountId); - // delete e-mail addresses - List toDelete = new List(); - foreach (string emailAddress in emailAddresses) - { - if (String.Compare(account.PrimaryEmailAddress, emailAddress, true) != 0) - toDelete.Add(emailAddress); - } + // delete e-mail addresses + List toDelete = new List(); + foreach (string emailAddress in emailAddresses) + { + if (String.Compare(account.PrimaryEmailAddress, emailAddress, true) != 0) + toDelete.Add(emailAddress); + } - // delete from meta-base - DeleteAccountEmailAddresses(accountId, toDelete.ToArray()); + // delete from meta-base + DeleteAccountEmailAddresses(accountId, toDelete.ToArray()); - // delete from Exchange - Organization org = GetOrganization(itemId); - if (org == null) - return -1; + // delete from Exchange + Organization org = GetOrganization(itemId); + if (org == null) + return -1; - // update e-mail addresses + // update e-mail addresses int exchangeServiceId = GetExchangeServiceID(org.PackageId); ExchangeServer exchange = GetExchangeServer(exchangeServiceId, org.ServiceId); - - exchange.SetDistributionListEmailAddresses( - account.AccountName, - GetAccountSimpleEmailAddresses(itemId, accountId)); - return 0; - } - catch (Exception ex) - { - throw TaskManager.WriteError(ex); - } - finally - { - TaskManager.CompleteTask(); - } - } + List addressLists = new List(); + addressLists.Add(org.GlobalAddressList); + addressLists.Add(org.AddressList); + + exchange.SetDistributionListEmailAddresses( + account.AccountName, + GetAccountSimpleEmailAddresses(itemId, accountId), addressLists.ToArray()); + + return 0; + } + catch (Exception ex) + { + throw TaskManager.WriteError(ex); + } + finally + { + TaskManager.CompleteTask(); + } + } public static ResultObject SetDistributionListPermissions(int itemId, int accountId, string[] sendAsAccounts, string[] sendOnBehalfAccounts) @@ -3273,8 +3517,12 @@ namespace WebsitePanel.EnterpriseServer try { + List addressLists = new List(); + addressLists.Add(org.GlobalAddressList); + addressLists.Add(org.AddressList); + exchange.SetDistributionListPermissions(org.OrganizationId, account.AccountName, sendAsAccounts, - sendOnBehalfAccounts); + sendOnBehalfAccounts, addressLists.ToArray()); } catch(Exception ex) { @@ -3422,7 +3670,7 @@ namespace WebsitePanel.EnterpriseServer // add meta-item int accountId = AddAccount(itemId, ExchangeAccountType.PublicFolder, accountName, folderPath, email, mailEnabled, - 0, "", null); + 0, "", null, 0 , null); // register email address if(mailEnabled) diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/HostedSolution/OrganizationController.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/HostedSolution/OrganizationController.cs index d081ec48..07672218 100644 --- a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/HostedSolution/OrganizationController.cs +++ b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/HostedSolution/OrganizationController.cs @@ -633,7 +633,7 @@ namespace WebsitePanel.EnterpriseServer } - private static Organizations GetOrganizationProxy(int serviceId) + public static Organizations GetOrganizationProxy(int serviceId) { Organizations ws = new Organizations(); ServiceProviderProxy.Init(ws, serviceId); @@ -710,9 +710,6 @@ namespace WebsitePanel.EnterpriseServer org.Id = 1; org.OrganizationId = "fabrikam"; org.Name = "Fabrikam Inc"; - org.IssueWarningKB = 150000; - org.ProhibitSendKB = 170000; - org.ProhibitSendReceiveKB = 190000; org.KeepDeletedItemsDays = 14; org.GlobalAddressList = "FabrikamGAL"; return org; @@ -980,8 +977,17 @@ namespace WebsitePanel.EnterpriseServer OrganizationUsersPaged result = new OrganizationUsersPaged(); result.RecordsCount = (int)ds.Tables[0].Rows[0][0]; + List Tmpaccounts = new List(); + ObjectUtils.FillCollectionFromDataView(Tmpaccounts, ds.Tables[1].DefaultView); + result.PageUsers = Tmpaccounts.ToArray(); + List accounts = new List(); - ObjectUtils.FillCollectionFromDataView(accounts, ds.Tables[1].DefaultView); + + foreach (OrganizationUser user in Tmpaccounts.ToArray()) + { + accounts.Add(GetUserGeneralSettings(itemId, user.AccountId)); + } + result.PageUsers = accounts.ToArray(); return result; } @@ -993,22 +999,23 @@ namespace WebsitePanel.EnterpriseServer return DataProvider.ExchangeAccountEmailAddressExists(emailAddress); } - - private static int AddOrganizationUser(int itemId, string accountName, string displayName, string email, string accountPassword) - { + + private static int AddOrganizationUser(int itemId, string accountName, string displayName, string email, string sAMAccountName, string accountPassword, string subscriberNumber) + { return DataProvider.AddExchangeAccount(itemId, (int)ExchangeAccountType.User, accountName, displayName, email, false, string.Empty, - string.Empty, CryptoUtils.Encrypt(accountPassword)); - - } + sAMAccountName, CryptoUtils.Encrypt(accountPassword), 0, subscriberNumber.Trim()); + + } public static string GetAccountName(string loginName) { - string []parts = loginName.Split('@'); - return parts != null && parts.Length > 1 ? parts[0] : loginName; + //string []parts = loginName.Split('@'); + //return parts != null && parts.Length > 1 ? parts[0] : loginName; + return loginName; } - public static int CreateUser(int itemId, string displayName, string name, string domain, string password, bool enabled, bool sendNotification, string to, out string accountName) + public static int CreateUser(int itemId, string displayName, string name, string domain, string password, string subscriberNumber, bool enabled, bool sendNotification, string to, out string accountName) { if (string.IsNullOrEmpty(displayName)) throw new ArgumentNullException("displayName"); @@ -1023,55 +1030,171 @@ namespace WebsitePanel.EnterpriseServer throw new ArgumentNullException("password"); accountName = string.Empty; - + // check account int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo | DemandAccount.IsActive); if (accountCheck < 0) return accountCheck; - + // place log record TaskManager.StartTask("ORGANIZATION", "CREATE_USER"); TaskManager.ItemId = itemId; + TaskManager.Write("Organization ID :" + itemId); + TaskManager.Write("name :" + name); + TaskManager.Write("domain :" + domain); + TaskManager.Write("subscriberNumber :" + subscriberNumber); - // e-mail - string email = name + "@" + domain; + int userId = -1; - if (EmailAddressExists(email)) - return BusinessErrorCodes.ERROR_EXCHANGE_EMAIL_EXISTS; - - // load organization - Organization org = GetOrganization(itemId); - if (org == null) - return -1; - - // check package - int packageCheck = SecurityContext.CheckPackage(org.PackageId, DemandPackage.IsActive); - if (packageCheck < 0) return packageCheck; - - int errorCode; - if (!CheckUserQuota(org.Id, out errorCode)) - return errorCode; - - - Organizations orgProxy = GetOrganizationProxy(org.ServiceId); - - string upn = string.Format("{0}@{1}", name, domain); - accountName = BuildAccountName(org.OrganizationId, name); - orgProxy.CreateUser(org.OrganizationId, accountName, displayName, upn, password, enabled); - - int userId = AddOrganizationUser(itemId, accountName, displayName, email, password); - - // register email address - AddAccountEmailAddress(userId, email); - - if (sendNotification) + try { - SendSummaryLetter(org.Id, userId, true, to, ""); + displayName = displayName.Trim(); + name = name.Trim(); + domain = domain.Trim(); + + // e-mail + string email = name + "@" + domain; + + if (EmailAddressExists(email)) + return BusinessErrorCodes.ERROR_EXCHANGE_EMAIL_EXISTS; + + // load organization + Organization org = GetOrganization(itemId); + if (org == null) + return -1; + + // check package + int packageCheck = SecurityContext.CheckPackage(org.PackageId, DemandPackage.IsActive); + if (packageCheck < 0) return packageCheck; + + int errorCode; + if (!CheckUserQuota(org.Id, out errorCode)) + return errorCode; + + + Organizations orgProxy = GetOrganizationProxy(org.ServiceId); + + string upn = string.Format("{0}@{1}", name, domain); + string sAMAccountName = BuildAccountName(org.OrganizationId, name); + + TaskManager.Write("accountName :" + sAMAccountName); + TaskManager.Write("upn :" + upn); + + if (orgProxy.CreateUser(org.OrganizationId, sAMAccountName, displayName, upn, password, enabled) == 0) + { + OrganizationUser retUser = orgProxy.GetUserGeneralSettings(upn, org.OrganizationId); + TaskManager.Write("sAMAccountName :" + retUser.DomainUserName); + + userId = AddOrganizationUser(itemId, upn, displayName, email, retUser.DomainUserName, password, subscriberNumber); + accountName = upn; + + // register email address + AddAccountEmailAddress(userId, email); + + if (sendNotification) + { + SendSummaryLetter(org.Id, userId, true, to, ""); + } + } + else + { + TaskManager.WriteError("Failed to create user"); + } } + catch (Exception ex) + { + TaskManager.WriteError(ex); + } + finally + { + TaskManager.CompleteTask(); + } + + return userId; + } + + + + public static int ImportUser(int itemId, string accountName, string displayName, string name, string domain, string password, string subscriberNumber) + { + if (string.IsNullOrEmpty(accountName)) + throw new ArgumentNullException("accountName"); + + if (string.IsNullOrEmpty(displayName)) + throw new ArgumentNullException("displayName"); + + if (string.IsNullOrEmpty(name)) + throw new ArgumentNullException("name"); + + if (string.IsNullOrEmpty(domain)) + throw new ArgumentNullException("domain"); + + if (string.IsNullOrEmpty(password)) + throw new ArgumentNullException("password"); + + + // place log record + TaskManager.StartTask("ORGANIZATION", "IMPORT_USER"); + TaskManager.ItemId = itemId; + TaskManager.Write("Organization ID :" + itemId); + TaskManager.Write("account :" + accountName); + TaskManager.Write("name :" + name); + TaskManager.Write("domain :" + domain); + + int userId = -1; + + try + { + accountName = accountName.Trim(); + displayName = displayName.Trim(); + name = name.Trim(); + domain = domain.Trim(); + + // e-mail + string email = name + "@" + domain; + + if (EmailAddressExists(email)) + return BusinessErrorCodes.ERROR_EXCHANGE_EMAIL_EXISTS; + + // load organization + Organization org = GetOrganization(itemId); + if (org == null) + return -1; + + // check package + int packageCheck = SecurityContext.CheckPackage(org.PackageId, DemandPackage.IsActive); + if (packageCheck < 0) return packageCheck; + + int errorCode; + if (!CheckUserQuota(org.Id, out errorCode)) + return errorCode; + + Organizations orgProxy = GetOrganizationProxy(org.ServiceId); + + string upn = string.Format("{0}@{1}", name, domain); + TaskManager.Write("upn :" + upn); + + OrganizationUser retUser = orgProxy.GetUserGeneralSettings(accountName, org.OrganizationId); + + TaskManager.Write("sAMAccountName :" + retUser.DomainUserName); + + userId = AddOrganizationUser(itemId, accountName, displayName, email, retUser.DomainUserName, password, subscriberNumber); + + AddAccountEmailAddress(userId, email); + + } + catch (Exception ex) + { + TaskManager.WriteError(ex); + } + finally + { + TaskManager.CompleteTask(); + } + return userId; } - private static void AddAccountEmailAddress(int accountId, string emailAddress) { @@ -1080,28 +1203,40 @@ namespace WebsitePanel.EnterpriseServer private static string BuildAccountName(string orgId, string name) { - int maxLen = 19 - orgId.Length; - - // try to choose name - int i = 0; - while (true) + string accountName = name = name.Replace(" ", ""); + string CounterStr = "00000"; + int counter = 0; + bool bFound = false; + do { - string num = i > 0 ? i.ToString() : ""; - int len = maxLen - num.Length; + accountName = genSamLogin(name, CounterStr); - if (name.Length > len) - name = name.Substring(0, len); + if (!AccountExists(accountName)) bFound = true; - string accountName = name + num + "_" + orgId; - - // check if already exists - if (!AccountExists(accountName)) - return accountName; - - i++; + CounterStr = counter.ToString("d5"); + counter++; } + while (!bFound); + + return accountName; } + private static string genSamLogin(string login, string strCounter) + { + int maxLogin = 20; + int fullLen = login.Length + strCounter.Length; + if (fullLen <= maxLogin) + return login + strCounter; + else + { + if (login.Length - (fullLen - maxLogin) > 0) + return login.Substring(0, login.Length - (fullLen - maxLogin)) + strCounter; + else return strCounter; // ???? + } + + } + + private static bool AccountExists(string accountName) { return DataProvider.ExchangeAccountExists(accountName); @@ -1180,6 +1315,18 @@ namespace WebsitePanel.EnterpriseServer return account; } + public static OrganizationUser GetAccountByAccountName(int itemId, string AccountName) + { + OrganizationUser account = ObjectUtils.FillObjectFromDataReader( + DataProvider.GetExchangeAccountByAccountName(itemId, AccountName)); + + if (account == null) + return null; + + return account; + } + + private static void DeleteUserFromMetabase(int itemId, int accountId) { // try to get organization @@ -1217,11 +1364,16 @@ namespace WebsitePanel.EnterpriseServer string accountName = GetAccountName(account.AccountName); - OrganizationUser retUser = orgProxy.GeUserGeneralSettings(accountName, org.OrganizationId); + OrganizationUser retUser = orgProxy.GetUserGeneralSettings(accountName, org.OrganizationId); retUser.AccountId = accountId; retUser.AccountName = account.AccountName; retUser.PrimaryEmailAddress = account.PrimaryEmailAddress; retUser.AccountType = account.AccountType; + retUser.CrmUserId = CRMController.GetCrmUserId(accountId); + retUser.IsOCSUser = DataProvider.CheckOCSUserExists(accountId); + //retUser.IsLyncUser = DataProvider.CheckLyncUserExists(accountId); + retUser.IsBlackBerryUser = BlackBerryController.CheckBlackBerryUserExists(accountId); + retUser.SubscriberNumber = account.SubscriberNumber; return retUser; } @@ -1240,7 +1392,7 @@ namespace WebsitePanel.EnterpriseServer string lastName, string address, string city, string state, string zip, string country, string jobTitle, string company, string department, string office, string managerAccountName, string businessPhone, string fax, string homePhone, string mobilePhone, string pager, - string webPage, string notes, string externalEmail) + string webPage, string notes, string externalEmail, string subscriberNumber) { // check account @@ -1253,6 +1405,10 @@ namespace WebsitePanel.EnterpriseServer try { + displayName = displayName.Trim(); + firstName = firstName.Trim(); + lastName = lastName.Trim(); + // load organization Organization org = GetOrganization(itemId); if (org == null) @@ -1303,6 +1459,7 @@ namespace WebsitePanel.EnterpriseServer // update account account.DisplayName = displayName; + account.SubscriberNumber = subscriberNumber; //account. if (!String.IsNullOrEmpty(password)) @@ -1329,7 +1486,8 @@ namespace WebsitePanel.EnterpriseServer { DataProvider.UpdateExchangeAccount(account.AccountId, account.AccountName, account.AccountType, account.DisplayName, account.PrimaryEmailAddress, account.MailEnabledPublicFolder, - account.MailboxManagerActions.ToString(), account.SamAccountName, account.AccountPassword); + account.MailboxManagerActions.ToString(), account.SamAccountName, account.AccountPassword, account.MailboxPlanId, + (string.IsNullOrEmpty(account.SubscriberNumber) ? null : account.SubscriberNumber.Trim())); } @@ -1377,11 +1535,58 @@ namespace WebsitePanel.EnterpriseServer } #endregion - return ObjectUtils.CreateListFromDataReader( - DataProvider.SearchOrganizationAccounts(SecurityContext.User.UserId, itemId, - filterColumn, filterValue, sortColumn, includeMailboxes)); + List Tmpaccounts = ObjectUtils.CreateListFromDataReader( + DataProvider.SearchOrganizationAccounts(SecurityContext.User.UserId, itemId, + filterColumn, filterValue, sortColumn, includeMailboxes)); + + List Accounts = new List(); + + foreach (OrganizationUser user in Tmpaccounts.ToArray()) + { + Accounts.Add(GetUserGeneralSettings(itemId, user.AccountId)); + } + + return Accounts; } + public static int GetAccountIdByUserPrincipalName(int itemId, string userPrincipalName) + { + // place log record + TaskManager.StartTask("ORGANIZATION", "GET_ACCOUNT_BYUPN"); + TaskManager.ItemId = itemId; + + int accounId = -1; + + try + { + // load organization + Organization org = GetOrganization(itemId); + if (org == null) + return 0; + + // get samaccountName + //Organizations orgProxy = GetOrganizationProxy(org.ServiceId); + //string accountName = orgProxy.GetSamAccountNameByUserPrincipalName(org.OrganizationId, userPrincipalName); + + // load account + OrganizationUser account = GetAccountByAccountName(itemId, userPrincipalName); + + if (account != null) + accounId = account.AccountId; + + return accounId; + } + catch (Exception ex) + { + throw TaskManager.WriteError(ex); + } + finally + { + TaskManager.CompleteTask(); + } + } + + #endregion public static List GetOrganizationDomains(int itemId) diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/esExchangeServer.asmx.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/esExchangeServer.asmx.cs index 984bbd28..41fbd9d8 100644 --- a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/esExchangeServer.asmx.cs +++ b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/esExchangeServer.asmx.cs @@ -46,80 +46,81 @@ namespace WebsitePanel.EnterpriseServer [ToolboxItem(false)] public class esExchangeServer : WebService { - #region Organizations - [WebMethod] - public DataSet GetRawExchangeOrganizationsPaged(int packageId, bool recursive, - string filterColumn, string filterValue, string sortColumn, int startRow, int maximumRows) - { - return ExchangeServerController.GetRawExchangeOrganizationsPaged(packageId, recursive, - filterColumn, filterValue, sortColumn, startRow, maximumRows); - } + #region Organizations + [WebMethod] + public DataSet GetRawExchangeOrganizationsPaged(int packageId, bool recursive, + string filterColumn, string filterValue, string sortColumn, int startRow, int maximumRows) + { + return ExchangeServerController.GetRawExchangeOrganizationsPaged(packageId, recursive, + filterColumn, filterValue, sortColumn, startRow, maximumRows); + } - [WebMethod] - public OrganizationsPaged GetExchangeOrganizationsPaged(int packageId, bool recursive, - string filterColumn, string filterValue, string sortColumn, int startRow, int maximumRows) - { - return ExchangeServerController.GetExchangeOrganizationsPaged(packageId, recursive, - filterColumn, filterValue, sortColumn, startRow, maximumRows); - } + [WebMethod] + public OrganizationsPaged GetExchangeOrganizationsPaged(int packageId, bool recursive, + string filterColumn, string filterValue, string sortColumn, int startRow, int maximumRows) + { + return ExchangeServerController.GetExchangeOrganizationsPaged(packageId, recursive, + filterColumn, filterValue, sortColumn, startRow, maximumRows); + } - [WebMethod] - public List GetExchangeOrganizations(int packageId, bool recursive) - { - return ExchangeServerController.GetExchangeOrganizations(packageId, recursive); - } + [WebMethod] + public List GetExchangeOrganizations(int packageId, bool recursive) + { + return ExchangeServerController.GetExchangeOrganizations(packageId, recursive); + } - [WebMethod] - public Organization GetOrganization(int itemId) - { - return ExchangeServerController.GetOrganization(itemId); - } + [WebMethod] + public Organization GetOrganization(int itemId) + { + return ExchangeServerController.GetOrganization(itemId); + } - [WebMethod] - public OrganizationStatistics GetOrganizationStatistics(int itemId) - { - return ExchangeServerController.GetOrganizationStatistics(itemId); - } + [WebMethod] + public OrganizationStatistics GetOrganizationStatistics(int itemId) + { + return ExchangeServerController.GetOrganizationStatistics(itemId); + } - - [WebMethod] - public int DeleteOrganization(int itemId) - { - return ExchangeServerController.DeleteOrganization(itemId); - } - [WebMethod] - public Organization GetOrganizationStorageLimits(int itemId) - { - return ExchangeServerController.GetOrganizationStorageLimits(itemId); - } + [WebMethod] + public int DeleteOrganization(int itemId) + { + return ExchangeServerController.DeleteOrganization(itemId); + } - [WebMethod] - public int SetOrganizationStorageLimits(int itemId, int issueWarningKB, int prohibitSendKB, - int prohibitSendReceiveKB, int keepDeletedItemsDays, bool applyToMailboxes) - { - return ExchangeServerController.SetOrganizationStorageLimits(itemId, issueWarningKB, prohibitSendKB, - prohibitSendReceiveKB, keepDeletedItemsDays, applyToMailboxes); - } + [WebMethod] + public Organization GetOrganizationStorageLimits(int itemId) + { + return ExchangeServerController.GetOrganizationStorageLimits(itemId); + } - [WebMethod] - public ExchangeItemStatistics[] GetMailboxesStatistics(int itemId) - { - return ExchangeServerController.GetMailboxesStatistics(itemId); - } + [WebMethod] + public int SetOrganizationStorageLimits(int itemId, int issueWarningKB, int prohibitSendKB, + int prohibitSendReceiveKB, int keepDeletedItemsDays, bool applyToMailboxes) + { + return ExchangeServerController.SetOrganizationStorageLimits(itemId, issueWarningKB, prohibitSendKB, + prohibitSendReceiveKB, keepDeletedItemsDays, applyToMailboxes); + } - [WebMethod] - public ExchangeItemStatistics[] GetPublicFoldersStatistics(int itemId) - { - return ExchangeServerController.GetPublicFoldersStatistics(itemId); - } + [WebMethod] + public ExchangeItemStatistics[] GetMailboxesStatistics(int itemId) + { + return ExchangeServerController.GetMailboxesStatistics(itemId); + } - [WebMethod] - public int CalculateOrganizationDiskspace(int itemId) - { - return ExchangeServerController.CalculateOrganizationDiskspace(itemId); - } + [WebMethod] + public ExchangeMailboxStatistics GetMailboxStatistics(int itemId, int accountId) + { + return ExchangeServerController.GetMailboxStatistics(itemId, accountId); + } + + + [WebMethod] + public int CalculateOrganizationDiskspace(int itemId) + { + return ExchangeServerController.CalculateOrganizationDiskspace(itemId); + } [WebMethod] public ExchangeActiveSyncPolicy GetActiveSyncPolicy(int itemId) @@ -139,14 +140,14 @@ namespace WebsitePanel.EnterpriseServer passwordRecoveryEnabled, deviceEncryptionEnabled, allowSimplePassword, maxPasswordFailedAttempts, minPasswordLength, inactivityLockMin, passwordExpirationDays, passwordHistory, refreshInteval); } - #endregion + #endregion - #region Domains - [WebMethod] + #region Domains + [WebMethod] public int AddAuthoritativeDomain(int itemId, int domainId) - { + { return ExchangeServerController.AddAuthoritativeDomain(itemId, domainId); - } + } [WebMethod] public int DeleteAuthoritativeDomain(int itemId, int domainId) @@ -155,42 +156,42 @@ namespace WebsitePanel.EnterpriseServer } - #endregion + #endregion - #region Accounts - [WebMethod] - public ExchangeAccountsPaged GetAccountsPaged(int itemId, string accountTypes, - string filterColumn, string filterValue, string sortColumn, - int startRow, int maximumRows) - { + #region Accounts + [WebMethod] + public ExchangeAccountsPaged GetAccountsPaged(int itemId, string accountTypes, + string filterColumn, string filterValue, string sortColumn, + int startRow, int maximumRows) + { return ExchangeServerController.GetAccountsPaged(itemId, accountTypes, - filterColumn, filterValue, sortColumn, - startRow, maximumRows); - } + filterColumn, filterValue, sortColumn, + startRow, maximumRows); + } - [WebMethod] - public List GetAccounts(int itemId, ExchangeAccountType accountType) - { - return ExchangeServerController.GetAccounts(itemId, accountType); - } + [WebMethod] + public List GetAccounts(int itemId, ExchangeAccountType accountType) + { + return ExchangeServerController.GetAccounts(itemId, accountType); + } - [WebMethod] - public List SearchAccounts(int itemId, - bool includeMailboxes, bool includeContacts, bool includeDistributionLists, + [WebMethod] + public List SearchAccounts(int itemId, + bool includeMailboxes, bool includeContacts, bool includeDistributionLists, bool includeRooms, bool includeEquipment, - string filterColumn, string filterValue, string sortColumn) - { - return ExchangeServerController.SearchAccounts(itemId, - includeMailboxes, includeContacts, includeDistributionLists, + string filterColumn, string filterValue, string sortColumn) + { + return ExchangeServerController.SearchAccounts(itemId, + includeMailboxes, includeContacts, includeDistributionLists, includeRooms, includeEquipment, - filterColumn, filterValue, sortColumn); - } + filterColumn, filterValue, sortColumn); + } - [WebMethod] - public ExchangeAccount GetAccount(int itemId, int accountId) - { - return ExchangeServerController.GetAccount(itemId, accountId); - } + [WebMethod] + public ExchangeAccount GetAccount(int itemId, int accountId) + { + return ExchangeServerController.GetAccount(itemId, accountId); + } [WebMethod] public ExchangeAccount SearchAccount(ExchangeAccountType accountType, string primaryEmailAddress) @@ -204,21 +205,21 @@ namespace WebsitePanel.EnterpriseServer return ExchangeServerController.CheckAccountCredentials(itemId, email, password); } - #endregion + #endregion - #region Mailboxes - [WebMethod] - public int CreateMailbox(int itemId, int accountId, ExchangeAccountType accountType, string accountName, string displayName, - string name, string domain, string password, bool sendSetupInstructions, string setupInstructionMailAddress) - { - return ExchangeServerController.CreateMailbox(itemId, accountId, accountType, accountName, displayName, name, domain, password, sendSetupInstructions, setupInstructionMailAddress); - } + #region Mailboxes + [WebMethod] + public int CreateMailbox(int itemId, int accountId, ExchangeAccountType accountType, string accountName, string displayName, + string name, string domain, string password, bool sendSetupInstructions, string setupInstructionMailAddress, int mailboxPlanId, string subscriberNumber) + { + return ExchangeServerController.CreateMailbox(itemId, accountId, accountType, accountName, displayName, name, domain, password, sendSetupInstructions, setupInstructionMailAddress, mailboxPlanId, subscriberNumber); + } - [WebMethod] - public int DeleteMailbox(int itemId, int accountId) - { - return ExchangeServerController.DeleteMailbox(itemId, accountId); - } + [WebMethod] + public int DeleteMailbox(int itemId, int accountId) + { + return ExchangeServerController.DeleteMailbox(itemId, accountId); + } [WebMethod] public int DisableMailbox(int itemId, int accountId) @@ -227,87 +228,66 @@ namespace WebsitePanel.EnterpriseServer } - [WebMethod] - public ExchangeMailbox GetMailboxGeneralSettings(int itemId, int accountId) - { - return ExchangeServerController.GetMailboxGeneralSettings(itemId, accountId); - } + [WebMethod] + public ExchangeMailbox GetMailboxGeneralSettings(int itemId, int accountId) + { + return ExchangeServerController.GetMailboxGeneralSettings(itemId, accountId); + } - [WebMethod] - public int SetMailboxGeneralSettings(int itemId, int accountId, string displayName, - string password, bool hideAddressBook, bool disabled, string firstName, string initials, - string lastName, string address, string city, string state, string zip, string country, - string jobTitle, string company, string department, string office, string managerAccountName, - string businessPhone, string fax, string homePhone, string mobilePhone, string pager, - string webPage, string notes) - { - return ExchangeServerController.SetMailboxGeneralSettings(itemId, accountId, displayName, - password, hideAddressBook, disabled, firstName, initials, - lastName, address, city, state, zip, country, - jobTitle, company, department, office, managerAccountName, - businessPhone, fax, homePhone, mobilePhone, pager, - webPage, notes); - } + [WebMethod] + public int SetMailboxGeneralSettings(int itemId, int accountId, bool hideAddressBook, bool disabled) + { + return ExchangeServerController.SetMailboxGeneralSettings(itemId, accountId, hideAddressBook, disabled); + } - [WebMethod] - public ExchangeEmailAddress[] GetMailboxEmailAddresses(int itemId, int accountId) - { - return ExchangeServerController.GetMailboxEmailAddresses(itemId, accountId); - } + [WebMethod] + public ExchangeEmailAddress[] GetMailboxEmailAddresses(int itemId, int accountId) + { + return ExchangeServerController.GetMailboxEmailAddresses(itemId, accountId); + } - [WebMethod] - public int AddMailboxEmailAddress(int itemId, int accountId, string emailAddress) - { - return ExchangeServerController.AddMailboxEmailAddress(itemId, accountId, emailAddress); - } + [WebMethod] + public int AddMailboxEmailAddress(int itemId, int accountId, string emailAddress) + { + return ExchangeServerController.AddMailboxEmailAddress(itemId, accountId, emailAddress); + } - [WebMethod] - public int SetMailboxPrimaryEmailAddress(int itemId, int accountId, string emailAddress) - { - return ExchangeServerController.SetMailboxPrimaryEmailAddress(itemId, accountId, emailAddress); - } + [WebMethod] + public int SetMailboxPrimaryEmailAddress(int itemId, int accountId, string emailAddress) + { + return ExchangeServerController.SetMailboxPrimaryEmailAddress(itemId, accountId, emailAddress); + } - [WebMethod] - public int DeleteMailboxEmailAddresses(int itemId, int accountId, string[] emailAddresses) - { - return ExchangeServerController.DeleteMailboxEmailAddresses(itemId, accountId, emailAddresses); - } + [WebMethod] + public int DeleteMailboxEmailAddresses(int itemId, int accountId, string[] emailAddresses) + { + return ExchangeServerController.DeleteMailboxEmailAddresses(itemId, accountId, emailAddresses); + } - [WebMethod] - public ExchangeMailbox GetMailboxMailFlowSettings(int itemId, int accountId) - { - return ExchangeServerController.GetMailboxMailFlowSettings(itemId, accountId); - } + [WebMethod] + public ExchangeMailbox GetMailboxMailFlowSettings(int itemId, int accountId) + { + return ExchangeServerController.GetMailboxMailFlowSettings(itemId, accountId); + } - [WebMethod] - public int SetMailboxMailFlowSettings(int itemId, int accountId, - bool enableForwarding, string forwardingAccountName, bool forwardToBoth, - string[] sendOnBehalfAccounts, string[] acceptAccounts, string[] rejectAccounts, - int maxRecipients, int maxSendMessageSizeKB, int maxReceiveMessageSizeKB, + [WebMethod] + public int SetMailboxMailFlowSettings(int itemId, int accountId, + bool enableForwarding, string forwardingAccountName, bool forwardToBoth, + string[] sendOnBehalfAccounts, string[] acceptAccounts, string[] rejectAccounts, bool requireSenderAuthentication) - { - return ExchangeServerController.SetMailboxMailFlowSettings(itemId, accountId, - enableForwarding, forwardingAccountName, forwardToBoth, - sendOnBehalfAccounts, acceptAccounts, rejectAccounts, - maxRecipients, maxSendMessageSizeKB, maxReceiveMessageSizeKB, - requireSenderAuthentication); - } + { + return ExchangeServerController.SetMailboxMailFlowSettings(itemId, accountId, + enableForwarding, forwardingAccountName, forwardToBoth, + sendOnBehalfAccounts, acceptAccounts, rejectAccounts, + requireSenderAuthentication); + } - [WebMethod] - public ExchangeMailbox GetMailboxAdvancedSettings(int itemId, int accountId) - { - return ExchangeServerController.GetMailboxAdvancedSettings(itemId, accountId); - } - [WebMethod] - public int SetMailboxAdvancedSettings(int itemId, int accountId, bool enablePOP, - bool enableIMAP, bool enableOWA, bool enableMAPI, bool enableActiveSync, - int issueWarningKB, int prohibitSendKB, int prohibitSendReceiveKB, int keepDeletedItemsDays) - { - return ExchangeServerController.SetMailboxAdvancedSettings(itemId, accountId, enablePOP, - enableIMAP, enableOWA, enableMAPI, enableActiveSync, - issueWarningKB, prohibitSendKB, prohibitSendReceiveKB, keepDeletedItemsDays); - } + [WebMethod] + public int SetExchangeMailboxPlan(int itemId, int accountId, int mailboxPlanId) + { + return ExchangeServerController.SetExchangeMailboxPlan(itemId, accountId, mailboxPlanId); + } [WebMethod] public string GetMailboxSetupInstructions(int itemId, int accountId, bool pmm, bool emailMode, bool signup) @@ -327,137 +307,137 @@ namespace WebsitePanel.EnterpriseServer return ExchangeServerController.SetMailboxManagerSettings(itemId, accountId, pmmAllowed, action); } - [WebMethod] + [WebMethod] public ExchangeMailbox GetMailboxPermissions(int itemId, int accountId) { - return ExchangeServerController.GetMailboxPermissions(itemId, accountId); + return ExchangeServerController.GetMailboxPermissions(itemId, accountId); } [WebMethod] public int SetMailboxPermissions(int itemId, int accountId, string[] sendAsaccounts, string[] fullAccessAcounts) { - return ExchangeServerController.SetMailboxPermissions(itemId, accountId, sendAsaccounts, fullAccessAcounts); + return ExchangeServerController.SetMailboxPermissions(itemId, accountId, sendAsaccounts, fullAccessAcounts); } - - - #endregion - #region Contacts - [WebMethod] - public int CreateContact(int itemId, string displayName, string email) - { - return ExchangeServerController.CreateContact(itemId, displayName, email); - } - [WebMethod] - public int DeleteContact(int itemId, int accountId) - { - return ExchangeServerController.DeleteContact(itemId, accountId); - } + #endregion - [WebMethod] - public ExchangeContact GetContactGeneralSettings(int itemId, int accountId) - { - return ExchangeServerController.GetContactGeneralSettings(itemId, accountId); - } + #region Contacts + [WebMethod] + public int CreateContact(int itemId, string displayName, string email) + { + return ExchangeServerController.CreateContact(itemId, displayName, email); + } - [WebMethod] - public int SetContactGeneralSettings(int itemId, int accountId, string displayName, string emailAddress, - bool hideAddressBook, string firstName, string initials, - string lastName, string address, string city, string state, string zip, string country, - string jobTitle, string company, string department, string office, string managerAccountName, - string businessPhone, string fax, string homePhone, string mobilePhone, string pager, + [WebMethod] + public int DeleteContact(int itemId, int accountId) + { + return ExchangeServerController.DeleteContact(itemId, accountId); + } + + [WebMethod] + public ExchangeContact GetContactGeneralSettings(int itemId, int accountId) + { + return ExchangeServerController.GetContactGeneralSettings(itemId, accountId); + } + + [WebMethod] + public int SetContactGeneralSettings(int itemId, int accountId, string displayName, string emailAddress, + bool hideAddressBook, string firstName, string initials, + string lastName, string address, string city, string state, string zip, string country, + string jobTitle, string company, string department, string office, string managerAccountName, + string businessPhone, string fax, string homePhone, string mobilePhone, string pager, string webPage, string notes, int useMapiRichTextFormat) - { - return ExchangeServerController.SetContactGeneralSettings(itemId, accountId, displayName, emailAddress, - hideAddressBook, firstName, initials, - lastName, address, city, state, zip, country, - jobTitle, company, department, office, managerAccountName, - businessPhone, fax, homePhone, mobilePhone, pager, - webPage, notes, useMapiRichTextFormat); - } + { + return ExchangeServerController.SetContactGeneralSettings(itemId, accountId, displayName, emailAddress, + hideAddressBook, firstName, initials, + lastName, address, city, state, zip, country, + jobTitle, company, department, office, managerAccountName, + businessPhone, fax, homePhone, mobilePhone, pager, + webPage, notes, useMapiRichTextFormat); + } - [WebMethod] - public ExchangeContact GetContactMailFlowSettings(int itemId, int accountId) - { - return ExchangeServerController.GetContactMailFlowSettings(itemId, accountId); - } + [WebMethod] + public ExchangeContact GetContactMailFlowSettings(int itemId, int accountId) + { + return ExchangeServerController.GetContactMailFlowSettings(itemId, accountId); + } - [WebMethod] - public int SetContactMailFlowSettings(int itemId, int accountId, - string[] acceptAccounts, string[] rejectAccounts, bool requireSenderAuthentication) - { - return ExchangeServerController.SetContactMailFlowSettings(itemId, accountId, - acceptAccounts, rejectAccounts, requireSenderAuthentication); - } - #endregion + [WebMethod] + public int SetContactMailFlowSettings(int itemId, int accountId, + string[] acceptAccounts, string[] rejectAccounts, bool requireSenderAuthentication) + { + return ExchangeServerController.SetContactMailFlowSettings(itemId, accountId, + acceptAccounts, rejectAccounts, requireSenderAuthentication); + } + #endregion - #region Distribution Lists - [WebMethod] - public int CreateDistributionList(int itemId, string displayName, string name, string domain, int managerId) - { - return ExchangeServerController.CreateDistributionList(itemId, displayName, name, domain, managerId); - } + #region Distribution Lists + [WebMethod] + public int CreateDistributionList(int itemId, string displayName, string name, string domain, int managerId) + { + return ExchangeServerController.CreateDistributionList(itemId, displayName, name, domain, managerId); + } - [WebMethod] - public int DeleteDistributionList(int itemId, int accountId) - { - return ExchangeServerController.DeleteDistributionList(itemId, accountId); - } + [WebMethod] + public int DeleteDistributionList(int itemId, int accountId) + { + return ExchangeServerController.DeleteDistributionList(itemId, accountId); + } - [WebMethod] - public ExchangeDistributionList GetDistributionListGeneralSettings(int itemId, int accountId) - { - return ExchangeServerController.GetDistributionListGeneralSettings(itemId, accountId); - } + [WebMethod] + public ExchangeDistributionList GetDistributionListGeneralSettings(int itemId, int accountId) + { + return ExchangeServerController.GetDistributionListGeneralSettings(itemId, accountId); + } - [WebMethod] - public int SetDistributionListGeneralSettings(int itemId, int accountId, string displayName, - bool hideAddressBook, string managerAccount, string[] memberAccounts, - string notes) - { - return ExchangeServerController.SetDistributionListGeneralSettings(itemId, accountId, displayName, - hideAddressBook, managerAccount, memberAccounts, - notes); - } + [WebMethod] + public int SetDistributionListGeneralSettings(int itemId, int accountId, string displayName, + bool hideAddressBook, string managerAccount, string[] memberAccounts, + string notes) + { + return ExchangeServerController.SetDistributionListGeneralSettings(itemId, accountId, displayName, + hideAddressBook, managerAccount, memberAccounts, + notes); + } - [WebMethod] - public ExchangeDistributionList GetDistributionListMailFlowSettings(int itemId, int accountId) - { - return ExchangeServerController.GetDistributionListMailFlowSettings(itemId, accountId); - } + [WebMethod] + public ExchangeDistributionList GetDistributionListMailFlowSettings(int itemId, int accountId) + { + return ExchangeServerController.GetDistributionListMailFlowSettings(itemId, accountId); + } - [WebMethod] - public int SetDistributionListMailFlowSettings(int itemId, int accountId, - string[] acceptAccounts, string[] rejectAccounts, bool requireSenderAuthentication) - { - return ExchangeServerController.SetDistributionListMailFlowSettings(itemId, accountId, - acceptAccounts, rejectAccounts, requireSenderAuthentication); - } + [WebMethod] + public int SetDistributionListMailFlowSettings(int itemId, int accountId, + string[] acceptAccounts, string[] rejectAccounts, bool requireSenderAuthentication) + { + return ExchangeServerController.SetDistributionListMailFlowSettings(itemId, accountId, + acceptAccounts, rejectAccounts, requireSenderAuthentication); + } - [WebMethod] - public ExchangeEmailAddress[] GetDistributionListEmailAddresses(int itemId, int accountId) - { - return ExchangeServerController.GetDistributionListEmailAddresses(itemId, accountId); - } + [WebMethod] + public ExchangeEmailAddress[] GetDistributionListEmailAddresses(int itemId, int accountId) + { + return ExchangeServerController.GetDistributionListEmailAddresses(itemId, accountId); + } - [WebMethod] - public int AddDistributionListEmailAddress(int itemId, int accountId, string emailAddress) - { - return ExchangeServerController.AddDistributionListEmailAddress(itemId, accountId, emailAddress); - } + [WebMethod] + public int AddDistributionListEmailAddress(int itemId, int accountId, string emailAddress) + { + return ExchangeServerController.AddDistributionListEmailAddress(itemId, accountId, emailAddress); + } - [WebMethod] - public int SetDistributionListPrimaryEmailAddress(int itemId, int accountId, string emailAddress) - { - return ExchangeServerController.SetDistributionListPrimaryEmailAddress(itemId, accountId, emailAddress); - } + [WebMethod] + public int SetDistributionListPrimaryEmailAddress(int itemId, int accountId, string emailAddress) + { + return ExchangeServerController.SetDistributionListPrimaryEmailAddress(itemId, accountId, emailAddress); + } - [WebMethod] - public int DeleteDistributionListEmailAddresses(int itemId, int accountId, string[] emailAddresses) - { - return ExchangeServerController.DeleteDistributionListEmailAddresses(itemId, accountId, emailAddresses); - } + [WebMethod] + public int DeleteDistributionListEmailAddresses(int itemId, int accountId, string[] emailAddresses) + { + return ExchangeServerController.DeleteDistributionListEmailAddresses(itemId, accountId, emailAddresses); + } [WebMethod] public ResultObject SetDistributionListPermissions(int itemId, int accountId, string[] sendAsAccounts, string[] sendOnBehalfAccounts) @@ -470,9 +450,77 @@ namespace WebsitePanel.EnterpriseServer { return ExchangeServerController.GetDistributionListPermissions(itemId, accountId); } - + #endregion + #region MobileDevice + + [WebMethod] + public ExchangeMobileDevice[] GetMobileDevices(int itemId, int accountId) + { + return ExchangeServerController.GetMobileDevices(itemId, accountId); + } + + [WebMethod] + public ExchangeMobileDevice GetMobileDevice(int itemId, string deviceId) + { + return ExchangeServerController.GetMobileDevice(itemId, deviceId); + } + + [WebMethod] + public void WipeDataFromDevice(int itemId, string deviceId) + { + ExchangeServerController.WipeDataFromDevice(itemId, deviceId); + } + + [WebMethod] + public void CancelRemoteWipeRequest(int itemId, string deviceId) + { + ExchangeServerController.CancelRemoteWipeRequest(itemId, deviceId); + } + + [WebMethod] + public void RemoveDevice(int itemId, string deviceId) + { + ExchangeServerController.RemoveDevice(itemId, deviceId); + } + + #endregion + + #region MailboxPlans + [WebMethod] + public List GetExchangeMailboxPlans(int itemId) + { + return ExchangeServerController.GetExchangeMailboxPlans(itemId); + } + + [WebMethod] + public ExchangeMailboxPlan GetExchangeMailboxPlan(int itemId, int mailboxPlanId) + { + return ExchangeServerController.GetExchangeMailboxPlan(itemId, mailboxPlanId); + } + + [WebMethod] + public int AddExchangeMailboxPlan(int itemId, ExchangeMailboxPlan mailboxPlan) + { + return ExchangeServerController.AddExchangeMailboxPlan(itemId, mailboxPlan); + } + + [WebMethod] + public int DeleteExchangeMailboxPlan(int itemId, int mailboxPlanId) + { + return ExchangeServerController.DeleteExchangeMailboxPlan(itemId, mailboxPlanId); + } + + [WebMethod] + public void SetOrganizationDefaultExchangeMailboxPlan(int itemId, int mailboxPlanId) + { + ExchangeServerController.SetOrganizationDefaultExchangeMailboxPlan(itemId, mailboxPlanId); + } + + #endregion + + #region Public Folders [WebMethod] public int CreatePublicFolder(int itemId, string parentFolder, string folderName, @@ -560,39 +608,7 @@ namespace WebsitePanel.EnterpriseServer } #endregion - #region MobileDevice - [WebMethod] - public ExchangeMobileDevice[] GetMobileDevices(int itemId, int accountId) - { - return ExchangeServerController.GetMobileDevices(itemId, accountId); - } - - [WebMethod] - public ExchangeMobileDevice GetMobileDevice(int itemId, string deviceId) - { - return ExchangeServerController.GetMobileDevice(itemId, deviceId); - } - - [WebMethod] - public void WipeDataFromDevice(int itemId, string deviceId) - { - ExchangeServerController.WipeDataFromDevice(itemId, deviceId); - } - - [WebMethod] - public void CancelRemoteWipeRequest(int itemId, string deviceId) - { - ExchangeServerController.CancelRemoteWipeRequest(itemId, deviceId); - } - - [WebMethod] - public void RemoveDevice(int itemId, string deviceId) - { - ExchangeServerController.RemoveDevice(itemId, deviceId); - } - - #endregion } } diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/esOrganizations.asmx.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/esOrganizations.asmx.cs index 3f9dccbd..9bccc46a 100644 --- a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/esOrganizations.asmx.cs +++ b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/esOrganizations.asmx.cs @@ -1,4 +1,4 @@ -// Copyright (c) 2012, Outercurve Foundation. +// Copyright (c) 2011, Outercurve Foundation. // All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, @@ -46,10 +46,10 @@ namespace WebsitePanel.EnterpriseServer #region Organizations [WebMethod] - public int CreateOrganization(int packageId, string organizationID, string organizationName) + public int CreateOrganization(int packageId, string organizationID, string organizationName) { return OrganizationController.CreateOrganization(packageId, organizationID, organizationName); - + } [WebMethod] @@ -60,7 +60,7 @@ namespace WebsitePanel.EnterpriseServer filterColumn, filterValue, sortColumn, startRow, maximumRows); } - + [WebMethod] public List GetOrganizations(int packageId, bool recursive) { @@ -72,13 +72,13 @@ namespace WebsitePanel.EnterpriseServer { return OrganizationController.GetOrganizationUserSummuryLetter(itemId, accountId, pmm, emailMode, signup); } - + [WebMethod] public int SendOrganizationUserSummuryLetter(int itemId, int accountId, bool signup, string to, string cc) { return OrganizationController.SendSummaryLetter(itemId, accountId, signup, to, cc); } - + [WebMethod] public int DeleteOrganization(int itemId) { @@ -97,6 +97,13 @@ namespace WebsitePanel.EnterpriseServer return OrganizationController.GetOrganization(itemId); } + [WebMethod] + public int GetAccountIdByUserPrincipalName(int itemId, string userPrincipalName) + { + return OrganizationController.GetAccountIdByUserPrincipalName(itemId, userPrincipalName); + } + + #endregion @@ -107,13 +114,13 @@ namespace WebsitePanel.EnterpriseServer { return OrganizationController.AddOrganizationDomain(itemId, domainName); } - + [WebMethod] public List GetOrganizationDomains(int itemId) { return OrganizationController.GetOrganizationDomains(itemId); } - + [WebMethod] public int DeleteOrganizationDomain(int itemId, int domainId) { @@ -132,15 +139,22 @@ namespace WebsitePanel.EnterpriseServer #region Users [WebMethod] - public int CreateUser(int itemId, string displayName, string name, string domain, string password, bool sendNotification, string to) + public int CreateUser(int itemId, string displayName, string name, string domain, string password, string subscriberNumber, bool sendNotification, string to) { string accountName; - return OrganizationController.CreateUser(itemId, displayName, name, domain, password, true, sendNotification, to, out accountName); + return OrganizationController.CreateUser(itemId, displayName, name, domain, password, subscriberNumber, true, sendNotification, to, out accountName); } + [WebMethod] + public int ImportUser(int itemId, string accountName, string displayName, string name, string domain, string password, string subscriberNumber) + { + return OrganizationController.ImportUser(itemId, accountName, displayName, name, domain, password, subscriberNumber); + } + + [WebMethod] public OrganizationUsersPaged GetOrganizationUsersPaged(int itemId, string filterColumn, string filterValue, string sortColumn, - int startRow, int maximumRows) + int startRow, int maximumRows) { return OrganizationController.GetOrganizationUsersPaged(itemId, filterColumn, filterValue, sortColumn, startRow, maximumRows); } @@ -157,30 +171,30 @@ namespace WebsitePanel.EnterpriseServer string lastName, string address, string city, string state, string zip, string country, string jobTitle, string company, string department, string office, string managerAccountName, string businessPhone, string fax, string homePhone, string mobilePhone, string pager, - string webPage, string notes, string externalEmail) + string webPage, string notes, string externalEmail, string subscriberNumber) { return OrganizationController.SetUserGeneralSettings(itemId, accountId, displayName, password, hideAddressBook, disabled, locked, firstName, initials, lastName, address, city, state, zip, country, jobTitle, company, department, office, managerAccountName, businessPhone, fax, homePhone, mobilePhone, pager, - webPage, notes, externalEmail); + webPage, notes, externalEmail, subscriberNumber); } [WebMethod] - public List SearchAccounts(int itemId, + public List SearchAccounts(int itemId, string filterColumn, string filterValue, string sortColumn, bool includeMailboxes) { return OrganizationController.SearchAccounts(itemId, filterColumn, filterValue, sortColumn, includeMailboxes); } - + [WebMethod] public int DeleteUser(int itemId, int accountId) { - return OrganizationController.DeleteUser(itemId, accountId); + return OrganizationController.DeleteUser(itemId, accountId); } diff --git a/WebsitePanel/Sources/WebsitePanel.Providers.Base/HostedSolution/ActiveDirectoryUtils.cs b/WebsitePanel/Sources/WebsitePanel.Providers.Base/HostedSolution/ActiveDirectoryUtils.cs index fb1092c6..cb38f66d 100644 --- a/WebsitePanel/Sources/WebsitePanel.Providers.Base/HostedSolution/ActiveDirectoryUtils.cs +++ b/WebsitePanel/Sources/WebsitePanel.Providers.Base/HostedSolution/ActiveDirectoryUtils.cs @@ -1,4 +1,4 @@ -// Copyright (c) 2012, Outercurve Foundation. +// Copyright (c) 2011, Outercurve Foundation. // All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, @@ -39,7 +39,7 @@ namespace WebsitePanel.Providers.HostedSolution { public static DirectoryEntry GetADObject(string path) { - DirectoryEntry de = new DirectoryEntry(path); + DirectoryEntry de = new DirectoryEntry(path); de.RefreshCache(); return de; } @@ -48,16 +48,16 @@ namespace WebsitePanel.Providers.HostedSolution { bool res = false; DirectorySearcher deSearch = new DirectorySearcher - { - Filter = - ("(&(objectClass=user)(samaccountname=" + samAccountName + "))") - }; + { + Filter = + ("(&(objectClass=user)(samaccountname=" + samAccountName + "))") + }; //get the group result SearchResult results = deSearch.FindOne(); DirectoryEntry de = results.GetDirectoryEntry(); PropertyValueCollection props = de.Properties["memberOf"]; - + foreach (string str in props) { if (str.IndexOf(group) != -1) @@ -81,8 +81,8 @@ namespace WebsitePanel.Providers.HostedSolution ou = parent.Children.Add( string.Format("OU={0}", name), - parent.SchemaClassName); - + parent.SchemaClassName); + ret = ou.Path; ou.CommitChanges(); } @@ -100,13 +100,13 @@ namespace WebsitePanel.Providers.HostedSolution public static void DeleteADObject(string path, bool removeChild) { DirectoryEntry entry = GetADObject(path); - + if (removeChild && entry.Children != null) foreach (DirectoryEntry child in entry.Children) { entry.Children.Remove(child); } - + DirectoryEntry parent = entry.Parent; if (parent != null) { @@ -115,7 +115,7 @@ namespace WebsitePanel.Providers.HostedSolution } } - + public static void DeleteADObject(string path) { DirectoryEntry entry = GetADObject(path); @@ -141,21 +141,34 @@ namespace WebsitePanel.Providers.HostedSolution } } else - { + { if (oDE.Properties.Contains(name)) { oDE.Properties[name].Remove(oDE.Properties[name][0]); } - + } } - public static void SetADObjectPropertyValue(DirectoryEntry oDE, string name, object value) + public static void SetADObjectPropertyValue(DirectoryEntry oDE, string name, string value) { PropertyValueCollection collection = oDE.Properties[name]; collection.Value = value; } - + + public static void SetADObjectPropertyValue(DirectoryEntry oDE, string name, Guid value) + { + PropertyValueCollection collection = oDE.Properties[name]; + collection.Value = value.ToByteArray(); + } + + public static void ClearADObjectPropertyValue(DirectoryEntry oDE, string name) + { + PropertyValueCollection collection = oDE.Properties[name]; + collection.Clear(); + } + + public static object GetADObjectProperty(DirectoryEntry entry, string name) { return entry.Properties.Contains(name) ? entry.Properties[name][0] : null; @@ -164,7 +177,7 @@ namespace WebsitePanel.Providers.HostedSolution public static string GetADObjectStringProperty(DirectoryEntry entry, string name) { object ret = GetADObjectProperty(entry, name); - return ret != null ? ret.ToString() : string.Empty; + return ret != null ? ret.ToString() : string.Empty; } public static string ConvertADPathToCanonicalName(string name) @@ -254,29 +267,38 @@ namespace WebsitePanel.Providers.HostedSolution return ret; } + public static string CreateUser(string path, string user, string displayName, string password, bool enabled) { - DirectoryEntry currentADObject = new DirectoryEntry(path); + return CreateUser(path, "", user, displayName, password, enabled); + } - DirectoryEntry newUserObject = currentADObject.Children.Add("CN=" + user, "User"); - - newUserObject.Properties[ADAttributes.SAMAccountName].Add(user); + public static string CreateUser(string path, string upn, string user, string displayName, string password, bool enabled) + { + DirectoryEntry currentADObject = new DirectoryEntry(path); + + string cn = string.Empty; + if (string.IsNullOrEmpty(upn)) cn = user; else cn = upn; + + DirectoryEntry newUserObject = currentADObject.Children.Add("CN=" + cn, "User"); + + newUserObject.Properties[ADAttributes.SAMAccountName].Add(user); SetADObjectProperty(newUserObject, ADAttributes.DisplayName, displayName); newUserObject.CommitChanges(); newUserObject.Invoke(ADAttributes.SetPassword, password); newUserObject.InvokeSet(ADAttributes.AccountDisabled, !enabled); newUserObject.CommitChanges(); - + return newUserObject.Path; } public static void CreateGroup(string path, string group) { - DirectoryEntry currentADObject = new DirectoryEntry(path); + DirectoryEntry currentADObject = new DirectoryEntry(path); DirectoryEntry newGroupObject = currentADObject.Children.Add("CN=" + group, "Group"); - + newGroupObject.Properties[ADAttributes.SAMAccountName].Add(group); newGroupObject.Properties[ADAttributes.GroupType].Add(-2147483640); @@ -320,7 +342,7 @@ namespace WebsitePanel.Providers.HostedSolution if (string.IsNullOrEmpty(primaryDomainController)) { dn = string.Format("LDAP://{0}", dn); - + } else dn = string.Format("LDAP://{0}/{1}", primaryDomainController, dn); @@ -358,7 +380,7 @@ namespace WebsitePanel.Providers.HostedSolution DirectoryEntry ou = GetADObject(ouPath); PropertyValueCollection prop = null; - prop = ou.Properties["uPNSuffixes"]; + prop = ou.Properties["uPNSuffixes"]; if (prop != null) { diff --git a/WebsitePanel/Sources/WebsitePanel.Providers.Base/HostedSolution/ExchangeAccount.cs b/WebsitePanel/Sources/WebsitePanel.Providers.Base/HostedSolution/ExchangeAccount.cs index 53110402..36fbfdde 100644 --- a/WebsitePanel/Sources/WebsitePanel.Providers.Base/HostedSolution/ExchangeAccount.cs +++ b/WebsitePanel/Sources/WebsitePanel.Providers.Base/HostedSolution/ExchangeAccount.cs @@ -32,32 +32,35 @@ using System.Text; namespace WebsitePanel.Providers.HostedSolution { - public class ExchangeAccount - { - int accountId; - int itemId; + public class ExchangeAccount + { + int accountId; + int itemId; int packageId; - ExchangeAccountType accountType; - string accountName; - string displayName; - string primaryEmailAddress; - bool mailEnabledPublicFolder; + string subscriberNumber; + ExchangeAccountType accountType; + string accountName; + string displayName; + string primaryEmailAddress; + bool mailEnabledPublicFolder; MailboxManagerActions mailboxManagerActions; string accountPassword; string samAccountName; + int mailboxPlanId; + string mailboxPlan; string publicFolderPermission; - public int AccountId - { - get { return this.accountId; } - set { this.accountId = value; } - } + public int AccountId + { + get { return this.accountId; } + set { this.accountId = value; } + } - public int ItemId - { + public int ItemId + { get { return this.itemId; } set { this.itemId = value; } - } + } public int PackageId { @@ -65,17 +68,17 @@ namespace WebsitePanel.Providers.HostedSolution set { this.packageId = value; } } - public ExchangeAccountType AccountType - { - get { return this.accountType; } - set { this.accountType = value; } - } + public ExchangeAccountType AccountType + { + get { return this.accountType; } + set { this.accountType = value; } + } - public string AccountName - { - get { return this.accountName; } - set { this.accountName = value; } - } + public string AccountName + { + get { return this.accountName; } + set { this.accountName = value; } + } public string SamAccountName { @@ -83,23 +86,23 @@ namespace WebsitePanel.Providers.HostedSolution set { this.samAccountName = value; } } - public string DisplayName - { - get { return this.displayName; } - set { this.displayName = value; } - } + public string DisplayName + { + get { return this.displayName; } + set { this.displayName = value; } + } - public string PrimaryEmailAddress - { - get { return this.primaryEmailAddress; } - set { this.primaryEmailAddress = value; } - } + public string PrimaryEmailAddress + { + get { return this.primaryEmailAddress; } + set { this.primaryEmailAddress = value; } + } - public bool MailEnabledPublicFolder - { - get { return this.mailEnabledPublicFolder; } - set { this.mailEnabledPublicFolder = value; } - } + public bool MailEnabledPublicFolder + { + get { return this.mailEnabledPublicFolder; } + set { this.mailEnabledPublicFolder = value; } + } public string AccountPassword { @@ -113,10 +116,31 @@ namespace WebsitePanel.Providers.HostedSolution set { this.mailboxManagerActions = value; } } + public int MailboxPlanId + { + get { return this.mailboxPlanId; } + set { this.mailboxPlanId = value; } + } + + public string MailboxPlan + { + get { return this.mailboxPlan; } + set { this.mailboxPlan = value; } + } + + + public string SubscriberNumber + { + get { return this.subscriberNumber; } + set { this.subscriberNumber = value; } + } + public string PublicFolderPermission { get { return this.publicFolderPermission; } set { this.publicFolderPermission = value; } } - } + + + } } diff --git a/WebsitePanel/Sources/WebsitePanel.Providers.Base/HostedSolution/ExchangeContact.cs b/WebsitePanel/Sources/WebsitePanel.Providers.Base/HostedSolution/ExchangeContact.cs index fe8984cc..689d1558 100644 --- a/WebsitePanel/Sources/WebsitePanel.Providers.Base/HostedSolution/ExchangeContact.cs +++ b/WebsitePanel/Sources/WebsitePanel.Providers.Base/HostedSolution/ExchangeContact.cs @@ -32,209 +32,219 @@ using System.Text; namespace WebsitePanel.Providers.HostedSolution { - public class ExchangeContact - { - string displayName; - string accountName; - string emailAddress; - bool hideFromAddressBook; + public class ExchangeContact + { + string displayName; + string accountName; + string emailAddress; + bool hideFromAddressBook; - string firstName; - string initials; - string lastName; + string firstName; + string initials; + string lastName; - string jobTitle; - string company; - string department; - string office; - ExchangeAccount managerAccount; + string jobTitle; + string company; + string department; + string office; + ExchangeAccount managerAccount; - string businessPhone; - string fax; - string homePhone; - string mobilePhone; - string pager; - string webPage; + string businessPhone; + string fax; + string homePhone; + string mobilePhone; + string pager; + string webPage; - string address; - string city; - string state; - string zip; - string country; + string address; + string city; + string state; + string zip; + string country; - string notes; - private int useMapiRichTextFormat; - - ExchangeAccount[] acceptAccounts; - ExchangeAccount[] rejectAccounts; - bool requireSenderAuthentication; + string notes; + string sAMAccountName; + private int useMapiRichTextFormat; - public string DisplayName - { - get { return this.displayName; } - set { this.displayName = value; } - } + ExchangeAccount[] acceptAccounts; + ExchangeAccount[] rejectAccounts; + bool requireSenderAuthentication; - public string AccountName - { - get { return this.accountName; } - set { this.accountName = value; } - } + public string DisplayName + { + get { return this.displayName; } + set { this.displayName = value; } + } - public string EmailAddress - { - get { return this.emailAddress; } - set { this.emailAddress = value; } - } + public string AccountName + { + get { return this.accountName; } + set { this.accountName = value; } + } - public bool HideFromAddressBook - { - get { return this.hideFromAddressBook; } - set { this.hideFromAddressBook = value; } - } + public string EmailAddress + { + get { return this.emailAddress; } + set { this.emailAddress = value; } + } - public string FirstName - { - get { return this.firstName; } - set { this.firstName = value; } - } + public bool HideFromAddressBook + { + get { return this.hideFromAddressBook; } + set { this.hideFromAddressBook = value; } + } - public string Initials - { - get { return this.initials; } - set { this.initials = value; } - } + public string FirstName + { + get { return this.firstName; } + set { this.firstName = value; } + } - public string LastName - { - get { return this.lastName; } - set { this.lastName = value; } - } + public string Initials + { + get { return this.initials; } + set { this.initials = value; } + } - public string JobTitle - { - get { return this.jobTitle; } - set { this.jobTitle = value; } - } + public string LastName + { + get { return this.lastName; } + set { this.lastName = value; } + } - public string Company - { - get { return this.company; } - set { this.company = value; } - } + public string JobTitle + { + get { return this.jobTitle; } + set { this.jobTitle = value; } + } - public string Department - { - get { return this.department; } - set { this.department = value; } - } + public string Company + { + get { return this.company; } + set { this.company = value; } + } - public string Office - { - get { return this.office; } - set { this.office = value; } - } + public string Department + { + get { return this.department; } + set { this.department = value; } + } - public ExchangeAccount ManagerAccount - { - get { return this.managerAccount; } - set { this.managerAccount = value; } - } + public string Office + { + get { return this.office; } + set { this.office = value; } + } - public string BusinessPhone - { - get { return this.businessPhone; } - set { this.businessPhone = value; } - } + public ExchangeAccount ManagerAccount + { + get { return this.managerAccount; } + set { this.managerAccount = value; } + } - public string Fax - { - get { return this.fax; } - set { this.fax = value; } - } + public string BusinessPhone + { + get { return this.businessPhone; } + set { this.businessPhone = value; } + } - public string HomePhone - { - get { return this.homePhone; } - set { this.homePhone = value; } - } + public string Fax + { + get { return this.fax; } + set { this.fax = value; } + } - public string MobilePhone - { - get { return this.mobilePhone; } - set { this.mobilePhone = value; } - } + public string HomePhone + { + get { return this.homePhone; } + set { this.homePhone = value; } + } - public string Pager - { - get { return this.pager; } - set { this.pager = value; } - } + public string MobilePhone + { + get { return this.mobilePhone; } + set { this.mobilePhone = value; } + } - public string WebPage - { - get { return this.webPage; } - set { this.webPage = value; } - } + public string Pager + { + get { return this.pager; } + set { this.pager = value; } + } - public string Address - { - get { return this.address; } - set { this.address = value; } - } + public string WebPage + { + get { return this.webPage; } + set { this.webPage = value; } + } - public string City - { - get { return this.city; } - set { this.city = value; } - } + public string Address + { + get { return this.address; } + set { this.address = value; } + } - public string State - { - get { return this.state; } - set { this.state = value; } - } + public string City + { + get { return this.city; } + set { this.city = value; } + } - public string Zip - { - get { return this.zip; } - set { this.zip = value; } - } + public string State + { + get { return this.state; } + set { this.state = value; } + } - public string Country - { - get { return this.country; } - set { this.country = value; } - } + public string Zip + { + get { return this.zip; } + set { this.zip = value; } + } - public string Notes - { - get { return this.notes; } - set { this.notes = value; } - } + public string Country + { + get { return this.country; } + set { this.country = value; } + } - public ExchangeAccount[] AcceptAccounts - { - get { return this.acceptAccounts; } - set { this.acceptAccounts = value; } - } + public string Notes + { + get { return this.notes; } + set { this.notes = value; } + } - public ExchangeAccount[] RejectAccounts - { - get { return this.rejectAccounts; } - set { this.rejectAccounts = value; } - } + public ExchangeAccount[] AcceptAccounts + { + get { return this.acceptAccounts; } + set { this.acceptAccounts = value; } + } - public bool RequireSenderAuthentication - { - get { return requireSenderAuthentication; } - set { requireSenderAuthentication = value; } - } + public ExchangeAccount[] RejectAccounts + { + get { return this.rejectAccounts; } + set { this.rejectAccounts = value; } + } - public int UseMapiRichTextFormat - { + public bool RequireSenderAuthentication + { + get { return requireSenderAuthentication; } + set { requireSenderAuthentication = value; } + } + + public int UseMapiRichTextFormat + { get { return useMapiRichTextFormat; } set { useMapiRichTextFormat = value; } - } - } + } + + public string SAMAccountName + { + get { return sAMAccountName; } + set { sAMAccountName = value; } + } + + + + } } diff --git a/WebsitePanel/Sources/WebsitePanel.Providers.Base/HostedSolution/ExchangeDistributionList.cs b/WebsitePanel/Sources/WebsitePanel.Providers.Base/HostedSolution/ExchangeDistributionList.cs index 17840d1f..6d3c5322 100644 --- a/WebsitePanel/Sources/WebsitePanel.Providers.Base/HostedSolution/ExchangeDistributionList.cs +++ b/WebsitePanel/Sources/WebsitePanel.Providers.Base/HostedSolution/ExchangeDistributionList.cs @@ -32,72 +32,79 @@ using System.Text; namespace WebsitePanel.Providers.HostedSolution { - public class ExchangeDistributionList - { - public string DisplayName - { - get; - set; - } + public class ExchangeDistributionList + { + public string DisplayName + { + get; + set; + } - public string AccountName - { - get; - set; - } + public string AccountName + { + get; + set; + } - public bool HideFromAddressBook - { - get; - set; - } + public bool HideFromAddressBook + { + get; + set; + } - public ExchangeAccount[] MembersAccounts - { - get; - set; - } + public ExchangeAccount[] MembersAccounts + { + get; + set; + } - public ExchangeAccount ManagerAccount - { - get; - set; - } + public ExchangeAccount ManagerAccount + { + get; + set; + } - public string Notes - { - get; - set; - } + public string Notes + { + get; + set; + } - public ExchangeAccount[] AcceptAccounts - { - get; - set; - } + public ExchangeAccount[] AcceptAccounts + { + get; + set; + } - public ExchangeAccount[] RejectAccounts - { - get; - set; - } + public ExchangeAccount[] RejectAccounts + { + get; + set; + } - public bool RequireSenderAuthentication - { - get; - set; - } - - public ExchangeAccount[] SendAsAccounts - { - get; - set; - } + public bool RequireSenderAuthentication + { + get; + set; + } - public ExchangeAccount[] SendOnBehalfAccounts - { - get; - set; - } - } + public ExchangeAccount[] SendAsAccounts + { + get; + set; + } + + public ExchangeAccount[] SendOnBehalfAccounts + { + get; + set; + } + + public string SAMAccountName + { + get; + set; + } + + } } diff --git a/WebsitePanel/Sources/WebsitePanel.Providers.Base/HostedSolution/ExchangeMailboxPlan.cs b/WebsitePanel/Sources/WebsitePanel.Providers.Base/HostedSolution/ExchangeMailboxPlan.cs new file mode 100644 index 00000000..167c5f04 --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.Providers.Base/HostedSolution/ExchangeMailboxPlan.cs @@ -0,0 +1,160 @@ +// Copyright (c) 2012, Outercurve Foundation. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// - Redistributions of source code must retain the above copyright notice, this +// list of conditions and the following disclaimer. +// +// - Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// - Neither the name of the Outercurve Foundation nor the names of its +// contributors may be used to endorse or promote products derived from this +// software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +using System; +using System.Collections.Generic; +using System.Text; + +namespace WebsitePanel.Providers.HostedSolution +{ + public class ExchangeMailboxPlan + { + int mailboxPlanId; + string mailboxPlan; + int mailboxSizeMB; + int maxRecipients; + int maxSendMessageSizeKB; + int maxReceiveMessageSizeKB; + + bool enablePOP; + bool enableIMAP; + bool enableOWA; + bool enableMAPI; + bool enableActiveSync; + + int issueWarningPct; + int prohibitSendPct; + int prohibitSendReceivePct; + int keepDeletedItemsDays; + bool isDefault; + bool hideFromAddressBook; + + public int MailboxPlanId + { + get { return this.mailboxPlanId; } + set { this.mailboxPlanId = value; } + } + + public string MailboxPlan + { + get { return this.mailboxPlan; } + set { this.mailboxPlan = value; } + } + + public int MailboxSizeMB + { + get { return this.mailboxSizeMB; } + set { this.mailboxSizeMB = value; } + } + + public bool IsDefault + { + get { return this.isDefault; } + set { this.isDefault = value; } + } + + public int MaxRecipients + { + get { return this.maxRecipients; } + set { this.maxRecipients = value; } + } + + public int MaxSendMessageSizeKB + { + get { return this.maxSendMessageSizeKB; } + set { this.maxSendMessageSizeKB = value; } + } + + public int MaxReceiveMessageSizeKB + { + get { return this.maxReceiveMessageSizeKB; } + set { this.maxReceiveMessageSizeKB = value; } + } + + public bool EnablePOP + { + get { return this.enablePOP; } + set { this.enablePOP = value; } + } + + public bool EnableIMAP + { + get { return this.enableIMAP; } + set { this.enableIMAP = value; } + } + + public bool EnableOWA + { + get { return this.enableOWA; } + set { this.enableOWA = value; } + } + + public bool EnableMAPI + { + get { return this.enableMAPI; } + set { this.enableMAPI = value; } + } + + public bool EnableActiveSync + { + get { return this.enableActiveSync; } + set { this.enableActiveSync = value; } + } + + public int IssueWarningPct + { + get { return this.issueWarningPct; } + set { this.issueWarningPct = value; } + } + + public int ProhibitSendPct + { + get { return this.prohibitSendPct; } + set { this.prohibitSendPct = value; } + } + + public int ProhibitSendReceivePct + { + get { return this.prohibitSendReceivePct; } + set { this.prohibitSendReceivePct = value; } + } + + public int KeepDeletedItemsDays + { + get { return this.keepDeletedItemsDays; } + set { this.keepDeletedItemsDays = value; } + } + + public bool HideFromAddressBook + { + get { return this.hideFromAddressBook; } + set { this.hideFromAddressBook = value; } + } + + } +} diff --git a/WebsitePanel/Sources/WebsitePanel.Providers.Base/HostedSolution/IExchangeServer.cs b/WebsitePanel/Sources/WebsitePanel.Providers.Base/HostedSolution/IExchangeServer.cs index 34651e08..559b9385 100644 --- a/WebsitePanel/Sources/WebsitePanel.Providers.Base/HostedSolution/IExchangeServer.cs +++ b/WebsitePanel/Sources/WebsitePanel.Providers.Base/HostedSolution/IExchangeServer.cs @@ -30,70 +30,71 @@ namespace WebsitePanel.Providers.HostedSolution { public interface IExchangeServer { - + bool CheckAccountCredentials(string username, string password); - // Organizations + // Organizations - string CreateMailEnableUser(string upn, string organizationId, string organizationDistinguishedName, ExchangeAccountType accountType, - string mailboxDatabase, string offlineAddressBook, - string accountName, bool enablePOP, bool enableIMAP, - bool enableOWA, bool enableMAPI, bool enableActiveSync, - int issueWarningKB, int prohibitSendKB, int prohibitSendReceiveKB, - int keepDeletedItemsDays); - - Organization ExtendToExchangeOrganization(string organizationId, string securityGroup); - string GetOABVirtualDirectory(); - Organization CreateOrganizationOfflineAddressBook(string organizationId, string securityGroup, string oabVirtualDir); - void UpdateOrganizationOfflineAddressBook(string id); - bool DeleteOrganization(string organizationId, string distinguishedName, string globalAddressList, string addressList, string roomsAddressList, string offlineAddressBook, string securityGroup); - void SetOrganizationStorageLimits(string organizationDistinguishedName, int issueWarningKB, int prohibitSendKB, int prohibitSendReceiveKB, int keepDeletedItemsDays); - ExchangeItemStatistics[] GetMailboxesStatistics(string organizationDistinguishedName); + string CreateMailEnableUser(string upn, string organizationId, string organizationDistinguishedName, ExchangeAccountType accountType, + string mailboxDatabase, string offlineAddressBook, string addressBookPolicy, + string accountName, bool enablePOP, bool enableIMAP, + bool enableOWA, bool enableMAPI, bool enableActiveSync, + int issueWarningKB, int prohibitSendKB, int prohibitSendReceiveKB, + int keepDeletedItemsDays, int maxRecipients, int maxSendMessageSizeKB, int maxReceiveMessageSizeKB, bool hideFromAddressBook, bool isConsumer); - // Domains + Organization ExtendToExchangeOrganization(string organizationId, string securityGroup, bool IsConsumer); + string GetOABVirtualDirectory(); + Organization CreateOrganizationOfflineAddressBook(string organizationId, string securityGroup, string oabVirtualDir); + Organization CreateOrganizationAddressBookPolicy(string organizationId, string gal, string addressBook, string roomList, string oab); + void UpdateOrganizationOfflineAddressBook(string id); + bool DeleteOrganization(string organizationId, string distinguishedName, string globalAddressList, string addressList, string roomList, string offlineAddressBook, string securityGroup, string addressBookPolicy); + void SetOrganizationStorageLimits(string organizationDistinguishedName, int issueWarningKB, int prohibitSendKB, int prohibitSendReceiveKB, int keepDeletedItemsDays); + ExchangeItemStatistics[] GetMailboxesStatistics(string organizationDistinguishedName); + + // Domains void AddAuthoritativeDomain(string domain); void DeleteAuthoritativeDomain(string domain); - string[] GetAuthoritativeDomains(); + string[] GetAuthoritativeDomains(); - // Mailboxes - string CreateMailbox(string organizationId, string organizationDistinguishedName, string mailboxDatabase, string securityGroup, string offlineAddressBook, ExchangeAccountType accountType, string displayName, string accountName, string name, string domain, string password, bool enablePOP, bool enableIMAP, bool enableOWA, bool enableMAPI, bool enableActiveSync, - int issueWarningKB, int prohibitSendKB, int prohibitSendReceiveKB, int keepDeletedItemsDays); - void DeleteMailbox(string accountName); + // Mailboxes + //string CreateMailbox(string organizationId, string organizationDistinguishedName, string mailboxDatabase, string securityGroup, string offlineAddressBook, string addressBookPolicy, ExchangeAccountType accountType, string displayName, string accountName, string name, string domain, string password, bool enablePOP, bool enableIMAP, bool enableOWA, bool enableMAPI, bool enableActiveSync, + // int issueWarningKB, int prohibitSendKB, int prohibitSendReceiveKB, int keepDeletedItemsDays, int maxRecipients, int maxSendMessageSizeKB, int maxReceiveMessageSizeKB,bool hideFromAddressBook); + void DeleteMailbox(string accountName); void DisableMailbox(string id); - ExchangeMailbox GetMailboxGeneralSettings(string accountName); - void SetMailboxGeneralSettings(string accountName, string displayName, string password, bool hideFromAddressBook, bool disabled, string firstName, string initials, string lastName, string address, string city, string state, string zip, string country, string jobTitle, string company, string department, string office, string managerAccountName, string businessPhone, string fax, string homePhone, string mobilePhone, string pager, string webPage, string notes); - ExchangeMailbox GetMailboxMailFlowSettings(string accountName); - void SetMailboxMailFlowSettings(string accountName, bool enableForwarding, string forwardingAccountName, bool forwardToBoth, string[] sendOnBehalfAccounts, string[] acceptAccounts, string[] rejectAccounts, int maxRecipients, int maxSendMessageSizeKB, int maxReceiveMessageSizeKB, bool requireSenderAuthentication); - ExchangeMailbox GetMailboxAdvancedSettings(string accountName); - void SetMailboxAdvancedSettings(string organizationId, string accountName, bool enablePOP, bool enableIMAP, bool enableOWA, bool enableMAPI, bool enableActiveSync, int issueWarningKB, int prohibitSendKB, int prohibitSendReceiveKB, int keepDeletedItemsDays); - ExchangeEmailAddress[] GetMailboxEmailAddresses(string accountName); - void SetMailboxEmailAddresses(string accountName, string[] emailAddresses); - void SetMailboxPrimaryEmailAddress(string accountName, string emailAddress); - void SetMailboxPermissions(string organizationId, string accountName, string[] sendAsAccounts, string[] fullAccessAccounts); - ExchangeMailbox GetMailboxPermissions(string organizationId, string accountName); - ExchangeMailboxStatistics GetMailboxStatistics(string accountName); + ExchangeMailbox GetMailboxGeneralSettings(string accountName); + void SetMailboxGeneralSettings(string accountName, bool hideFromAddressBook, bool disabled); + ExchangeMailbox GetMailboxMailFlowSettings(string accountName); + void SetMailboxMailFlowSettings(string accountName, bool enableForwarding, string forwardingAccountName, bool forwardToBoth, string[] sendOnBehalfAccounts, string[] acceptAccounts, string[] rejectAccounts, bool requireSenderAuthentication); + ExchangeMailbox GetMailboxAdvancedSettings(string accountName); + void SetMailboxAdvancedSettings(string organizationId, string accountName, bool enablePOP, bool enableIMAP, bool enableOWA, bool enableMAPI, bool enableActiveSync, int issueWarningKB, int prohibitSendKB, int prohibitSendReceiveKB, int keepDeletedItemsDays, int maxRecipients, int maxSendMessageSizeKB, int maxReceiveMessageSizeKB); + ExchangeEmailAddress[] GetMailboxEmailAddresses(string accountName); + void SetMailboxEmailAddresses(string accountName, string[] emailAddresses); + void SetMailboxPrimaryEmailAddress(string accountName, string emailAddress); + void SetMailboxPermissions(string organizationId, string accountName, string[] sendAsAccounts, string[] fullAccessAccounts); + ExchangeMailbox GetMailboxPermissions(string organizationId, string accountName); + ExchangeMailboxStatistics GetMailboxStatistics(string accountName); - // Contacts - void CreateContact(string organizationId, string organizationDistinguishedName, string contactDisplayName, string contactAccountName, string contactEmail, string defaultOrganizationDomain); - void DeleteContact(string accountName); - ExchangeContact GetContactGeneralSettings(string accountName); + // Contacts + void CreateContact(string organizationId, string organizationDistinguishedName, string contactDisplayName, string contactAccountName, string contactEmail, string defaultOrganizationDomain); + void DeleteContact(string accountName); + ExchangeContact GetContactGeneralSettings(string accountName); void SetContactGeneralSettings(string accountName, string displayName, string email, bool hideFromAddressBook, string firstName, string initials, string lastName, string address, string city, string state, string zip, string country, string jobTitle, string company, string department, string office, string managerAccountName, string businessPhone, string fax, string homePhone, string mobilePhone, string pager, string webPage, string notes, int useMapiRichTextFormat, string defaultDomain); - ExchangeContact GetContactMailFlowSettings(string accountName); - void SetContactMailFlowSettings(string accountName, string[] acceptAccounts, string[] rejectAccounts, bool requireSenderAuthentication); + ExchangeContact GetContactMailFlowSettings(string accountName); + void SetContactMailFlowSettings(string accountName, string[] acceptAccounts, string[] rejectAccounts, bool requireSenderAuthentication); - // Distribution Lists - void CreateDistributionList(string organizationId, string organizationDistinguishedName, string displayName, string accountName, string name, string domain, string managedBy); - void DeleteDistributionList(string accountName); - ExchangeDistributionList GetDistributionListGeneralSettings(string accountName); - void SetDistributionListGeneralSettings(string accountName, string displayName, bool hideFromAddressBook, string managedBy, string[] memebers, string notes); - void AddDistributionListMembers(string accountName, string[] memberAccounts); - void RemoveDistributionListMembers(string accountName, string[] memberAccounts); - ExchangeDistributionList GetDistributionListMailFlowSettings(string accountName); - void SetDistributionListMailFlowSettings(string accountName, string[] acceptAccounts, string[] rejectAccounts, bool requireSenderAuthentication); - ExchangeEmailAddress[] GetDistributionListEmailAddresses(string accountName); - void SetDistributionListEmailAddresses(string accountName, string[] emailAddresses); - void SetDistributionListPrimaryEmailAddress(string accountName, string emailAddress); - ExchangeDistributionList GetDistributionListPermissions(string organizationId, string accountName); - void SetDistributionListPermissions(string organizationId, string accountName, string[] sendAsAccounts, string[] sendOnBehalfAccounts); + // Distribution Lists + void CreateDistributionList(string organizationId, string organizationDistinguishedName, string displayName, string accountName, string name, string domain, string managedBy, string[] addressLists); + void DeleteDistributionList(string accountName); + ExchangeDistributionList GetDistributionListGeneralSettings(string accountName); + void SetDistributionListGeneralSettings(string accountName, string displayName, bool hideFromAddressBook, string managedBy, string[] memebers, string notes, string[] addressLists); + void AddDistributionListMembers(string accountName, string[] memberAccounts, string[] addressLists); + void RemoveDistributionListMembers(string accountName, string[] memberAccounts, string[] addressLists); + ExchangeDistributionList GetDistributionListMailFlowSettings(string accountName); + void SetDistributionListMailFlowSettings(string accountName, string[] acceptAccounts, string[] rejectAccounts, bool requireSenderAuthentication, string[] addressLists); + ExchangeEmailAddress[] GetDistributionListEmailAddresses(string accountName); + void SetDistributionListEmailAddresses(string accountName, string[] emailAddresses, string[] addressLists); + void SetDistributionListPrimaryEmailAddress(string accountName, string emailAddress, string[] addressLists); + ExchangeDistributionList GetDistributionListPermissions(string organizationId, string accountName); + void SetDistributionListPermissions(string organizationId, string accountName, string[] sendAsAccounts, string[] sendOnBehalfAccounts, string[] addressLists); // Public Folders void CreatePublicFolder(string organizationId, string securityGroup, string parentFolder, string folderName, bool mailEnabled, string accountName, string name, string domain); @@ -111,20 +112,20 @@ namespace WebsitePanel.Providers.HostedSolution string[] GetPublicFoldersRecursive(string parent); long GetPublicFolderSize(string folder); - //ActiveSync - void CreateOrganizationActiveSyncPolicy(string organizationId); - ExchangeActiveSyncPolicy GetActiveSyncPolicy(string organizationId); - void SetActiveSyncPolicy(string organizationId, bool allowNonProvisionableDevices, bool attachmentsEnabled, - int maxAttachmentSizeKB, bool uncAccessEnabled, bool wssAccessEnabled, bool devicePasswordEnabled, - bool alphanumericPasswordRequired, bool passwordRecoveryEnabled, bool deviceEncryptionEnabled, - bool allowSimplePassword, int maxPasswordFailedAttempts, int minPasswordLength, int inactivityLockMin, - int passwordExpirationDays, int passwordHistory, int refreshInterval); + //ActiveSync + void CreateOrganizationActiveSyncPolicy(string organizationId); + ExchangeActiveSyncPolicy GetActiveSyncPolicy(string organizationId); + void SetActiveSyncPolicy(string organizationId, bool allowNonProvisionableDevices, bool attachmentsEnabled, + int maxAttachmentSizeKB, bool uncAccessEnabled, bool wssAccessEnabled, bool devicePasswordEnabled, + bool alphanumericPasswordRequired, bool passwordRecoveryEnabled, bool deviceEncryptionEnabled, + bool allowSimplePassword, int maxPasswordFailedAttempts, int minPasswordLength, int inactivityLockMin, + int passwordExpirationDays, int passwordHistory, int refreshInterval); - //Mobile Devices - ExchangeMobileDevice[] GetMobileDevices(string accountName); - ExchangeMobileDevice GetMobileDevice(string id); - void WipeDataFromDevice(string id); - void CancelRemoteWipeRequest(string id); - void RemoveDevice(string id); - } + //Mobile Devices + ExchangeMobileDevice[] GetMobileDevices(string accountName); + ExchangeMobileDevice GetMobileDevice(string id); + void WipeDataFromDevice(string id); + void CancelRemoteWipeRequest(string id); + void RemoveDevice(string id); + } } diff --git a/WebsitePanel/Sources/WebsitePanel.Providers.Base/HostedSolution/IOrganization.cs b/WebsitePanel/Sources/WebsitePanel.Providers.Base/HostedSolution/IOrganization.cs index 11cef205..15846f9c 100644 --- a/WebsitePanel/Sources/WebsitePanel.Providers.Base/HostedSolution/IOrganization.cs +++ b/WebsitePanel/Sources/WebsitePanel.Providers.Base/HostedSolution/IOrganization.cs @@ -33,10 +33,10 @@ namespace WebsitePanel.Providers.HostedSolution public interface IOrganization { Organization CreateOrganization(string organizationId); - + void DeleteOrganization(string organizationId); - void CreateUser(string organizationId, string loginName, string displayName, string upn, string password, bool enabled); + int CreateUser(string organizationId, string loginName, string displayName, string upn, string password, bool enabled); void DeleteUser(string loginName, string organizationId); @@ -49,7 +49,7 @@ namespace WebsitePanel.Providers.HostedSolution string jobTitle, string company, string department, string office, string managerAccountName, string businessPhone, string fax, string homePhone, string mobilePhone, string pager, - string webPage, string notes, string externalEmail); + string webPage, string notes, string externalEmail); bool OrganizationExists(string organizationId); @@ -58,5 +58,7 @@ namespace WebsitePanel.Providers.HostedSolution void CreateOrganizationDomain(string organizationDistinguishedName, string domain); PasswordPolicyResult GetPasswordPolicy(); + + string GetSamAccountNameByUserPrincipalName(string organizationId, string userPrincipalName); } } diff --git a/WebsitePanel/Sources/WebsitePanel.Providers.Base/HostedSolution/Organization.cs b/WebsitePanel/Sources/WebsitePanel.Providers.Base/HostedSolution/Organization.cs index 677a52a7..3abfbd7f 100644 --- a/WebsitePanel/Sources/WebsitePanel.Providers.Base/HostedSolution/Organization.cs +++ b/WebsitePanel/Sources/WebsitePanel.Providers.Base/HostedSolution/Organization.cs @@ -41,12 +41,12 @@ namespace WebsitePanel.Providers.HostedSolution private string addressList; private string roomsAddressList; private string globalAddressList; + private string addressBookPolicy; + private string database; private string securityGroup; + private string lyncTenantId; private int diskSpace; - private int issueWarningKB; - private int prohibitSendKB; - private int prohibitSendReceiveKB; private int keepDeletedItemsDays; @@ -125,7 +125,7 @@ namespace WebsitePanel.Providers.HostedSolution get { return crmCurrency; } set { crmCurrency = value; } } - + [Persistent] public string DistinguishedName { @@ -151,7 +151,7 @@ namespace WebsitePanel.Providers.HostedSolution { return defaultDomain; } - } + } [Persistent] @@ -182,6 +182,13 @@ namespace WebsitePanel.Providers.HostedSolution set { globalAddressList = value; } } + [Persistent] + public string AddressBookPolicy + { + get { return addressBookPolicy; } + set { addressBookPolicy = value; } + } + [Persistent] public string Database { @@ -203,27 +210,6 @@ namespace WebsitePanel.Providers.HostedSolution set { diskSpace = value; } } - [Persistent] - public int IssueWarningKB - { - get { return issueWarningKB; } - set { issueWarningKB = value; } - } - - [Persistent] - public int ProhibitSendKB - { - get { return prohibitSendKB; } - set { prohibitSendKB = value; } - } - - [Persistent] - public int ProhibitSendReceiveKB - { - get { return prohibitSendReceiveKB; } - set { prohibitSendReceiveKB = value; } - } - [Persistent] public int KeepDeletedItemsDays { @@ -233,5 +219,15 @@ namespace WebsitePanel.Providers.HostedSolution [Persistent] public bool IsOCSOrganization { get; set; } + + + [Persistent] + public string LyncTenantId + { + get { return lyncTenantId; } + set { lyncTenantId = value; } + } + + } } diff --git a/WebsitePanel/Sources/WebsitePanel.Providers.Base/HostedSolution/OrganizationUser.cs b/WebsitePanel/Sources/WebsitePanel.Providers.Base/HostedSolution/OrganizationUser.cs index 53d73e5f..d3e2b62c 100644 --- a/WebsitePanel/Sources/WebsitePanel.Providers.Base/HostedSolution/OrganizationUser.cs +++ b/WebsitePanel/Sources/WebsitePanel.Providers.Base/HostedSolution/OrganizationUser.cs @@ -37,6 +37,7 @@ namespace WebsitePanel.Providers.HostedSolution private int accountId; private int itemId; private int packageId; + private string subscriberNumber; private string primaryEmailAddress; private string accountPassword; @@ -298,5 +299,13 @@ namespace WebsitePanel.Providers.HostedSolution set { isBlackBerryUser = value; } } + public string SubscriberNumber + { + get { return subscriberNumber; } + set { subscriberNumber = value; } + } + + + } } diff --git a/WebsitePanel/Sources/WebsitePanel.Providers.Base/HostedSolution/TransactionAction.cs b/WebsitePanel/Sources/WebsitePanel.Providers.Base/HostedSolution/TransactionAction.cs new file mode 100644 index 00000000..9b16e530 --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.Providers.Base/HostedSolution/TransactionAction.cs @@ -0,0 +1,71 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace WebsitePanel.Providers.HostedSolution +{ + public class TransactionAction + { + private TransactionActionTypes actionType; + + public TransactionActionTypes ActionType + { + get { return actionType; } + set { actionType = value; } + } + + private string id; + + public string Id + { + get { return id; } + set { id = value; } + } + + private string suffix; + + public string Suffix + { + get { return suffix; } + set { suffix = value; } + } + + private string account; + + public string Account + { + get { return account; } + set { account = value; } + + } + + public enum TransactionActionTypes + { + CreateOrganizationUnit, + CreateGlobalAddressList, + CreateAddressList, + CreateAddressBookPolicy, + CreateOfflineAddressBook, + CreateDistributionGroup, + EnableDistributionGroup, + CreateAcceptedDomain, + AddUPNSuffix, + CreateMailbox, + CreateContact, + CreatePublicFolder, + CreateActiveSyncPolicy, + AddMailboxFullAccessPermission, + AddSendAsPermission, + RemoveMailboxFullAccessPermission, + RemoveSendAsPermission, + EnableMailbox, + LyncNewSipDomain, + LyncNewSimpleUrl, + LyncNewUser, + LyncNewConferencingPolicy, + LyncNewExternalAccessPolicy, + LyncNewMobilityPolicy + }; + } +} diff --git a/WebsitePanel/Sources/WebsitePanel.Providers.Base/WebsitePanel.Providers.Base.csproj b/WebsitePanel/Sources/WebsitePanel.Providers.Base/WebsitePanel.Providers.Base.csproj index 1d281456..a74bff15 100644 --- a/WebsitePanel/Sources/WebsitePanel.Providers.Base/WebsitePanel.Providers.Base.csproj +++ b/WebsitePanel/Sources/WebsitePanel.Providers.Base/WebsitePanel.Providers.Base.csproj @@ -79,6 +79,8 @@ + + diff --git a/WebsitePanel/Sources/WebsitePanel.Providers.HostedSolution/Exchange2007.cs b/WebsitePanel/Sources/WebsitePanel.Providers.HostedSolution/Exchange2007.cs index 793ee9d6..d8f22589 100644 --- a/WebsitePanel/Sources/WebsitePanel.Providers.HostedSolution/Exchange2007.cs +++ b/WebsitePanel/Sources/WebsitePanel.Providers.HostedSolution/Exchange2007.cs @@ -28,6 +28,7 @@ using System; using System.IO; +using System.Collections; using System.Collections.Generic; using System.Collections.ObjectModel; using System.Text; @@ -67,7 +68,6 @@ namespace WebsitePanel.Providers.HostedSolution #region Constants private const string CONFIG_CLEAR_QUERYBASEDN = "WebsitePanel.Exchange.ClearQueryBaseDN"; - private const string CONFIG_ENABLESP2ABP = "WebsitePanel.Exchange.enableSP2abp"; #endregion #region Properties @@ -87,7 +87,12 @@ namespace WebsitePanel.Providers.HostedSolution get { return ProviderSettings["MailboxDatabase"]; } } - internal int KeepDeletedItemsDays + internal bool PublicFolderDistributionEnabled + { + get { return ProviderSettings.GetBool("PublicFolderDistributionEnabled"); } + } + + internal int KeepDeletedItemsDays { get { return Int32.Parse(ProviderSettings["KeepDeletedItemsDays"]); } } @@ -152,10 +157,10 @@ namespace WebsitePanel.Providers.HostedSolution /// /// /// - public Organization ExtendToExchangeOrganization(string organizationId, string securityGroup) - { - return ExtendToExchangeOrganizationInternal(organizationId, securityGroup); - } + public Organization ExtendToExchangeOrganization(string organizationId, string securityGroup, bool IsConsumer) + { + return ExtendToExchangeOrganizationInternal(organizationId, securityGroup, IsConsumer); + } /// /// Creates organization OAB on the Client Access Server @@ -183,13 +188,18 @@ namespace WebsitePanel.Providers.HostedSolution return GetOABVirtualDirectoryInternal(); } - public bool DeleteOrganization(string organizationId, string distinguishedName, - string globalAddressList, string addressList, string roomsAddressList, string offlineAddressBook, - string securityGroup) - { - return DeleteOrganizationInternal(organizationId, distinguishedName, globalAddressList, - addressList, roomsAddressList, offlineAddressBook, securityGroup); - } + public Organization CreateOrganizationAddressBookPolicy(string organizationId, string gal, string addressBook, string roomList, string oab) + { + return CreateOrganizationAddressBookPolicyInternal(organizationId, gal, addressBook, roomList, oab); + } + + public bool DeleteOrganization(string organizationId, string distinguishedName, + string globalAddressList, string addressList, string roomList, string offlineAddressBook, + string securityGroup, string addressBookPolicy) + { + return DeleteOrganizationInternal(organizationId, distinguishedName, globalAddressList, + addressList, roomList, offlineAddressBook, securityGroup, addressBookPolicy); + } public void SetOrganizationStorageLimits(string organizationDistinguishedName, int issueWarningKB, int prohibitSendKB, int prohibitSendReceiveKB, int keepDeletedItemsDays) @@ -234,7 +244,7 @@ namespace WebsitePanel.Providers.HostedSolution SetMailboxPermissionsInternal(organizationId, accountName, sendAsAccounts, fullAccessAccounts); } - +/* public string CreateMailbox(string organizationId, string organizationDistinguishedName, string mailboxDatabase, string securityGroup, string offlineAddressBook, ExchangeAccountType accountType, string displayName, @@ -247,7 +257,7 @@ namespace WebsitePanel.Providers.HostedSolution enableOWA, enableMAPI, enableActiveSync, issueWarningKB, prohibitSendKB, prohibitSendReceiveKB, keepDeletedItemsDays); } - +*/ public void DeleteMailbox(string accountName) { DeleteMailboxInternal(accountName); @@ -258,17 +268,9 @@ namespace WebsitePanel.Providers.HostedSolution return GetMailboxGeneralSettingsInternal(accountName); } - public void SetMailboxGeneralSettings(string accountName, string displayName, string password, - bool hideFromAddressBook, bool disabled, string firstName, string initials, string lastName, - string address, string city, string state, string zip, string country, string jobTitle, - string company, string department, string office, string managerAccountName, - string businessPhone, string fax, string homePhone, string mobilePhone, string pager, - string webPage, string notes) + public void SetMailboxGeneralSettings(string accountName, bool hideFromAddressBook, bool disabled) { - SetMailboxGeneralSettingsInternal(accountName, displayName, password, hideFromAddressBook, - disabled, firstName, initials, lastName, address, city, state, zip, country, jobTitle, - company, department, office, managerAccountName, businessPhone, fax, homePhone, - mobilePhone, pager, webPage, notes); + SetMailboxGeneralSettingsInternal(accountName, hideFromAddressBook, disabled); } public ExchangeMailbox GetMailboxMailFlowSettings(string accountName) @@ -276,29 +278,28 @@ namespace WebsitePanel.Providers.HostedSolution return GetMailboxMailFlowSettingsInternal(accountName); } - public void SetMailboxMailFlowSettings(string accountName, bool enableForwarding, - string forwardingAccountName, bool forwardToBoth, string[] sendOnBehalfAccounts, - string[] acceptAccounts, string[] rejectAccounts, int maxRecipients, int maxSendMessageSizeKB, - int maxReceiveMessageSizeKB, bool requireSenderAuthentication) - { - SetMailboxMailFlowSettingsInternal(accountName, enableForwarding, forwardingAccountName, - forwardToBoth, sendOnBehalfAccounts, acceptAccounts, rejectAccounts, maxRecipients, - maxSendMessageSizeKB, maxReceiveMessageSizeKB, requireSenderAuthentication); - } + public void SetMailboxMailFlowSettings(string accountName, bool enableForwarding, + string forwardingAccountName, bool forwardToBoth, string[] sendOnBehalfAccounts, + string[] acceptAccounts, string[] rejectAccounts, bool requireSenderAuthentication) + { + SetMailboxMailFlowSettingsInternal(accountName, enableForwarding, forwardingAccountName, + forwardToBoth, sendOnBehalfAccounts, acceptAccounts, rejectAccounts, requireSenderAuthentication); + } public ExchangeMailbox GetMailboxAdvancedSettings(string accountName) { return GetMailboxAdvancedSettingsInternal(accountName); } - public void SetMailboxAdvancedSettings(string organizationId, string accountName, bool enablePOP, - bool enableIMAP, bool enableOWA, bool enableMAPI, bool enableActiveSync, - int issueWarningKB, int prohibitSendKB, int prohibitSendReceiveKB, int keepDeletedItemsDays) - { - SetMailboxAdvancedSettingsInternal(organizationId, accountName, enablePOP, enableIMAP, enableOWA, - enableMAPI, enableActiveSync, issueWarningKB, - prohibitSendKB, prohibitSendReceiveKB, keepDeletedItemsDays); - } + public void SetMailboxAdvancedSettings(string organizationId, string accountName, bool enablePOP, + bool enableIMAP, bool enableOWA, bool enableMAPI, bool enableActiveSync, + int issueWarningKB, int prohibitSendKB, int prohibitSendReceiveKB, int keepDeletedItemsDays, int maxRecipients, int maxSendMessageSizeKB, + int maxReceiveMessageSizeKB) + { + SetMailboxAdvancedSettingsInternal(organizationId, accountName, enablePOP, enableIMAP, enableOWA, + enableMAPI, enableActiveSync, issueWarningKB, + prohibitSendKB, prohibitSendReceiveKB, keepDeletedItemsDays, maxRecipients, maxSendMessageSizeKB, maxReceiveMessageSizeKB); + } public ExchangeEmailAddress[] GetMailboxEmailAddresses(string accountName) { @@ -363,12 +364,12 @@ namespace WebsitePanel.Providers.HostedSolution #endregion #region Distribution lists - public void CreateDistributionList(string organizationId, string organizationDistinguishedName, - string displayName, string accountName, string name, string domain, string managedBy) - { - CreateDistributionListInternal(organizationId, organizationDistinguishedName, displayName, - accountName, name, domain, managedBy); - } + public void CreateDistributionList(string organizationId, string organizationDistinguishedName, + string displayName, string accountName, string name, string domain, string managedBy, string[] addressLists) + { + CreateDistributionListInternal(organizationId, organizationDistinguishedName, displayName, + accountName, name, domain, managedBy, addressLists); + } public void DeleteDistributionList(string accountName) { @@ -380,58 +381,59 @@ namespace WebsitePanel.Providers.HostedSolution return GetDistributionListGeneralSettingsInternal(accountName); } - public void SetDistributionListGeneralSettings(string accountName, string displayName, - bool hideFromAddressBook, string managedBy, string[] members, string notes) - { - SetDistributionListGeneralSettingsInternal(accountName, displayName, hideFromAddressBook, - managedBy, members, notes); - } + public void SetDistributionListGeneralSettings(string accountName, string displayName, + bool hideFromAddressBook, string managedBy, string[] members, string notes, string[] addressLists) + { + SetDistributionListGeneralSettingsInternal(accountName, displayName, hideFromAddressBook, + managedBy, members, notes, addressLists); + } - public void AddDistributionListMembers(string accountName, string[] memberAccounts) - { - AddDistributionListMembersInternal(accountName, memberAccounts); - } + public void AddDistributionListMembers(string accountName, string[] memberAccounts, string[] addressLists) + { + AddDistributionListMembersInternal(accountName, memberAccounts, addressLists); + } - public void RemoveDistributionListMembers(string accountName, string[] memberAccounts) - { - RemoveDistributionListMembersInternal(accountName, memberAccounts); - } + + public void RemoveDistributionListMembers(string accountName, string[] memberAccounts, string[] addressLists) + { + RemoveDistributionListMembersInternal(accountName, memberAccounts, addressLists); + } public ExchangeDistributionList GetDistributionListMailFlowSettings(string accountName) { return GetDistributionListMailFlowSettingsInternal(accountName); } - public void SetDistributionListMailFlowSettings(string accountName, string[] acceptAccounts, - string[] rejectAccounts, bool requireSenderAuthentication) - { - SetDistributionListMailFlowSettingsInternal(accountName, acceptAccounts, rejectAccounts, requireSenderAuthentication); - } + public void SetDistributionListMailFlowSettings(string accountName, string[] acceptAccounts, + string[] rejectAccounts, bool requireSenderAuthentication, string[] addressLists) + { + SetDistributionListMailFlowSettingsInternal(accountName, acceptAccounts, rejectAccounts, requireSenderAuthentication, addressLists); + } public ExchangeEmailAddress[] GetDistributionListEmailAddresses(string accountName) { return GetDistributionListEmailAddressesInternal(accountName); } - public void SetDistributionListEmailAddresses(string accountName, string[] emailAddresses) - { - SetDistributionListEmailAddressesInternal(accountName, emailAddresses); - } + public void SetDistributionListEmailAddresses(string accountName, string[] emailAddresses, string[] addressLists) + { + SetDistributionListEmailAddressesInternal(accountName, emailAddresses, addressLists); + } - public void SetDistributionListPrimaryEmailAddress(string accountName, string emailAddress) - { - SetDistributionListPrimaryEmailAddressInternal(accountName, emailAddress); - } + public void SetDistributionListPrimaryEmailAddress(string accountName, string emailAddress, string[] addressLists) + { + SetDistributionListPrimaryEmailAddressInternal(accountName, emailAddress, addressLists); + } public ExchangeDistributionList GetDistributionListPermissions(string organizationId, string accountName) { return GetDistributionListPermissionsInternal(organizationId, accountName, null); } - public void SetDistributionListPermissions(string organizationId, string accountName, string[] sendAsAccounts, string[] sendOnBehalfAccounts) - { - SetDistributionListPermissionsInternal(organizationId, accountName, sendAsAccounts, sendOnBehalfAccounts); - } + public void SetDistributionListPermissions(string organizationId, string accountName, string[] sendAsAccounts, string[] sendOnBehalfAccounts, string[] addressLists) + { + SetDistributionListPermissionsInternal(organizationId, accountName, sendAsAccounts, sendOnBehalfAccounts, addressLists); + } #endregion #region Public folders @@ -455,10 +457,10 @@ namespace WebsitePanel.Providers.HostedSolution public void DisableMailbox(string id) { - DisableMailboxIntenal(id); + DisableMailboxInternal(id); } - private void DisableMailboxIntenal(string id) + internal virtual void DisableMailboxInternal(string id) { ExchangeLog.LogStart("DisableMailboxIntenal"); Runspace runSpace = null; @@ -617,9 +619,9 @@ namespace WebsitePanel.Providers.HostedSolution if (item is Organization) { Organization org = item as Organization; - DeleteOrganization(org.OrganizationId, org.DistinguishedName, org.GlobalAddressList, - org.AddressList, org.RoomsAddressList, org.OfflineAddressBook, org.SecurityGroup); - } + DeleteOrganization(org.OrganizationId, org.DistinguishedName, org.GlobalAddressList, + org.AddressList, org.RoomsAddressList, org.OfflineAddressBook, org.SecurityGroup, org.AddressBookPolicy); + } else if (item is ExchangeDomain) { DeleteAcceptedDomain(item.Name); @@ -706,9 +708,9 @@ namespace WebsitePanel.Providers.HostedSolution /// /// /// - private Organization ExtendToExchangeOrganizationInternal(string organizationId, string securityGroup) - { - ExchangeLog.LogStart("CreateOrganizationInternal"); + internal virtual Organization ExtendToExchangeOrganizationInternal(string organizationId, string securityGroup, bool IsConsumer) + { + ExchangeLog.LogStart("CreateOrganizationInternal"); ExchangeLog.DebugInfo(" Organization Id: {0}", organizationId); ExchangeTransaction transaction = StartTransaction(); @@ -724,7 +726,7 @@ namespace WebsitePanel.Providers.HostedSolution //Create mail enabled organization security group EnableMailSecurityDistributionGroup(runSpace, securityGroup, organizationId); transaction.RegisterMailEnabledDistributionGroup(securityGroup); - UpdateSecurityDistributionGroup(runSpace, securityGroup, organizationId); + UpdateSecurityDistributionGroup(runSpace, securityGroup, organizationId, IsConsumer); //create GAL string galId = CreateGlobalAddressList(runSpace, organizationId); @@ -742,7 +744,7 @@ namespace WebsitePanel.Providers.HostedSolution string ralId = CreateRoomsAddressList(runSpace, organizationId); transaction.RegisterNewRoomsAddressList(ralId); ExchangeLog.LogInfo(" Rooms Address List: {0}", ralId); - UpdateRoomsAddressList(runSpace, ralId, securityGroupPath); + UpdateAddressList(runSpace, ralId, securityGroupPath); //create ActiveSync policy string asId = CreateActiveSyncPolicy(runSpace, organizationId); @@ -847,20 +849,6 @@ namespace WebsitePanel.Providers.HostedSolution transaction.RegisterNewOfflineAddressBook(oabId); UpdateOfflineAddressBook(runSpace, oabId, securityGroupId); info.OfflineAddressBook = oabId; - - //create ABP - - bool enableSP2abp = false; - if (ConfigurationManager.AppSettings[CONFIG_ENABLESP2ABP] != null) - enableSP2abp = Boolean.Parse(ConfigurationManager.AppSettings[CONFIG_ENABLESP2ABP]); - Version exchangeVersion = GetExchangeVersion(); - - if (enableSP2abp && (exchangeVersion >= new Version(14, 2))) - { - string abpId = CreateAddressPolicy(runSpace, organizationId); - transaction.RegisterNewAddressPolicy(abpId); - ExchangeLog.LogInfo(" Address Policy: {0}", abpId); - } } catch (Exception ex) { @@ -908,11 +896,17 @@ namespace WebsitePanel.Providers.HostedSolution } ExchangeLog.LogEnd("UpdateOrganizationOfflineAddressBookInternal"); } + + internal virtual Organization CreateOrganizationAddressBookPolicyInternal(string organizationId, string gal, string addressBook, string roomList, string oab) + { + Organization info = new Organization(); + return info; + } - private bool DeleteOrganizationInternal(string organizationId, string distinguishedName, - string globalAddressList, string addressList, string roomsAddressList, string offlineAddressBook, string securityGroup) - { + internal virtual bool DeleteOrganizationInternal(string organizationId, string distinguishedName, + string globalAddressList, string addressList, string roomsAddressList, string offlineAddressBook, string securityGroup, string addressBookPolicy) + { ExchangeLog.LogStart("DeleteOrganizationInternal"); bool ret = true; @@ -944,30 +938,6 @@ namespace WebsitePanel.Providers.HostedSolution if (!DeleteOrganizationPublicFolders(runSpace, organizationId)) ret = false; - //delete ABP - - bool enableSP2abp = false; - if (ConfigurationManager.AppSettings[CONFIG_ENABLESP2ABP] != null) - enableSP2abp = Boolean.Parse(ConfigurationManager.AppSettings[CONFIG_ENABLESP2ABP]); - Version exchangeVersion = GetExchangeVersion(); - - if (enableSP2abp && (exchangeVersion >= new Version(14, 2))) - { - - - string adpstring = GetAddressPolicyName(organizationId); - - try - { - if (!string.IsNullOrEmpty(adpstring)) - DeleteAddressPolicy(runSpace, adpstring); - } - catch (Exception ex) - { - ret = false; - ExchangeLog.LogError("Could not delete Address Policy " + globalAddressList, ex); - } - } //delete OAB try @@ -997,7 +967,7 @@ namespace WebsitePanel.Providers.HostedSolution try { if (!string.IsNullOrEmpty(roomsAddressList)) - DeleteRoomsAddressList(runSpace, roomsAddressList); + DeleteAddressList(runSpace, roomsAddressList); } catch (Exception ex) { @@ -1101,7 +1071,7 @@ namespace WebsitePanel.Providers.HostedSolution return ret; } - private bool DeleteOrganizationMailboxes(Runspace runSpace, string ou) + internal bool DeleteOrganizationMailboxes(Runspace runSpace, string ou) { ExchangeLog.LogStart("DeleteOrganizationMailboxes"); bool ret = true; @@ -1131,7 +1101,7 @@ namespace WebsitePanel.Providers.HostedSolution return ret; } - private bool DeleteOrganizationContacts(Runspace runSpace, string ou) + internal bool DeleteOrganizationContacts(Runspace runSpace, string ou) { ExchangeLog.LogStart("DeleteOrganizationContacts"); bool ret = true; @@ -1161,7 +1131,7 @@ namespace WebsitePanel.Providers.HostedSolution return ret; } - private bool DeleteOrganizationDistributionLists(Runspace runSpace, string ou) + internal bool DeleteOrganizationDistributionLists(Runspace runSpace, string ou) { ExchangeLog.LogStart("DeleteOrganizationDistributionLists"); bool ret = true; @@ -1392,7 +1362,7 @@ namespace WebsitePanel.Providers.HostedSolution return size; } - private long CalculatePublicFolderDiskSpace(Runspace runSpace, string folder) + internal virtual long CalculatePublicFolderDiskSpace(Runspace runSpace, string folder) { ExchangeLog.LogStart("CalculatePublicFolderDiskSpace"); ExchangeLog.DebugInfo("Folder: {0}", folder); @@ -1649,7 +1619,7 @@ namespace WebsitePanel.Providers.HostedSolution } - private void RemoveMailboxAccessPermission(Runspace runSpace, string accountName, string account, string accessRights) + internal void RemoveMailboxAccessPermission(Runspace runSpace, string accountName, string account, string accessRights) { ExchangeLog.LogStart("RemoveMailboxFullAccessPermission"); @@ -1779,167 +1749,165 @@ namespace WebsitePanel.Providers.HostedSolution public string CreateMailEnableUser(string upn, string organizationId, string organizationDistinguishedName, ExchangeAccountType accountType, - string mailboxDatabase, string offlineAddressBook, + string mailboxDatabase, string offlineAddressBook,string addressBookPolicy, string accountName, bool enablePOP, bool enableIMAP, bool enableOWA, bool enableMAPI, bool enableActiveSync, - int issueWarningKB, int prohibitSendKB, int prohibitSendReceiveKB, int keepDeletedItemsDays) + int issueWarningKB, int prohibitSendKB, int prohibitSendReceiveKB, int keepDeletedItemsDays, + int maxRecipients, int maxSendMessageSizeKB, int maxReceiveMessageSizeKB, bool hideFromAddressBook, bool IsConsumer) { return CreateMailEnableUserInternal(upn, organizationId, organizationDistinguishedName, accountType, - mailboxDatabase, offlineAddressBook, + mailboxDatabase, offlineAddressBook,addressBookPolicy, accountName, enablePOP, enableIMAP, enableOWA, enableMAPI, enableActiveSync, issueWarningKB, prohibitSendKB, prohibitSendReceiveKB, - keepDeletedItemsDays); + keepDeletedItemsDays, maxRecipients, maxSendMessageSizeKB, maxReceiveMessageSizeKB, hideFromAddressBook, IsConsumer); } - private string CreateMailEnableUserInternal(string upn, string organizationId, string organizationDistinguishedName, ExchangeAccountType accountType, - string mailboxDatabase, string offlineAddressBook, - string accountName, bool enablePOP, bool enableIMAP, - bool enableOWA, bool enableMAPI, bool enableActiveSync, - int issueWarningKB, int prohibitSendKB, int prohibitSendReceiveKB, int keepDeletedItemsDays) - { + internal virtual string CreateMailEnableUserInternal(string upn, string organizationId, string organizationDistinguishedName, ExchangeAccountType accountType, + string mailboxDatabase, string offlineAddressBook, string addressBookPolicy, + string accountName, bool enablePOP, bool enableIMAP, + bool enableOWA, bool enableMAPI, bool enableActiveSync, + int issueWarningKB, int prohibitSendKB, int prohibitSendReceiveKB, int keepDeletedItemsDays, + int maxRecipients, int maxSendMessageSizeKB, int maxReceiveMessageSizeKB, bool hideFromAddressBook, bool IsConsumer) + { - ExchangeLog.LogStart("CreateMailEnableUserInternal"); - ExchangeLog.DebugInfo("Organization Id: {0}", organizationId); + ExchangeLog.LogStart("CreateMailEnableUserInternal"); + ExchangeLog.DebugInfo("Organization Id: {0}", organizationId); - string ret = null; - ExchangeTransaction transaction = StartTransaction(); - Runspace runSpace = null; + string ret = null; + ExchangeTransaction transaction = StartTransaction(); + Runspace runSpace = null; - int attempts = 0; - string id = null; + int attempts = 0; + string id = null; Version exchangeVersion = GetExchangeVersion(); + + try + { + runSpace = OpenRunspace(); + Command cmd = null; + Collection result = null; + //try to enable mail user for 10 times + while (true) + { + try + { - try - { - runSpace = OpenRunspace(); - Command cmd = null; - Collection result = null; - - //try to enable mail user for 10 times - while (true) - { - try - { - //create mailbox - cmd = new Command("Enable-Mailbox"); - cmd.Parameters.Add("Identity", upn); - cmd.Parameters.Add("Alias", accountName); + //create mailbox + cmd = new Command("Enable-Mailbox"); + cmd.Parameters.Add("Identity", upn); + cmd.Parameters.Add("Alias", accountName); if (!(mailboxDatabase == "*" && exchangeVersion >= new Version(14, 0))) cmd.Parameters.Add("Database", mailboxDatabase); - if (accountType == ExchangeAccountType.Equipment) - cmd.Parameters.Add("Equipment"); - else if (accountType == ExchangeAccountType.Room) - cmd.Parameters.Add("Room"); + if (accountType == ExchangeAccountType.Equipment) + cmd.Parameters.Add("Equipment"); + else if (accountType == ExchangeAccountType.Room) + cmd.Parameters.Add("Room"); - result = ExecuteShellCommand(runSpace, cmd); + result = ExecuteShellCommand(runSpace, cmd); - id = CheckResultObjectDN(result); - } - catch (Exception ex) - { - ExchangeLog.LogError(ex); - } - if (id != null) - break; + id = CheckResultObjectDN(result); + } + catch (Exception ex) + { + ExchangeLog.LogError(ex); + } + if (id != null) + break; - if (attempts > 9) - throw new Exception( - string.Format("Could not enable mail user '{0}' ", accountName)); + if (attempts > 9) + throw new Exception( + string.Format("Could not enable mail user '{0}' ", accountName)); - attempts++; - ExchangeLog.LogWarning("Attempt #{0} to enable mail user failed!", attempts); - // wait 5 sec - System.Threading.Thread.Sleep(5000); - } + attempts++; + ExchangeLog.LogWarning("Attempt #{0} to enable mail user failed!", attempts); + // wait 5 sec + System.Threading.Thread.Sleep(5000); + } - //transaction.RegisterNewMailbox(id); + //transaction.RegisterNewMailbox(id); - string windowsEmailAddress = ObjToString(GetPSObjectProperty(result[0], "WindowsEmailAddress")); - string adpstring = GetAddressPolicyName(organizationId); + string windowsEmailAddress = ObjToString(GetPSObjectProperty(result[0], "WindowsEmailAddress")); - //update mailbox - cmd = new Command("Set-Mailbox"); - cmd.Parameters.Add("Identity", id); - cmd.Parameters.Add("OfflineAddressBook", offlineAddressBook); - cmd.Parameters.Add("EmailAddressPolicyEnabled", false); - cmd.Parameters.Add("CustomAttribute1", organizationId); - cmd.Parameters.Add("CustomAttribute3", windowsEmailAddress); - cmd.Parameters.Add("PrimarySmtpAddress", upn); - cmd.Parameters.Add("WindowsEmailAddress", upn); - - bool enableSP2abp = false; - if (ConfigurationManager.AppSettings[CONFIG_ENABLESP2ABP] != null) - enableSP2abp = Boolean.Parse(ConfigurationManager.AppSettings[CONFIG_ENABLESP2ABP]); - if (enableSP2abp && (exchangeVersion >= new Version(14, 2))) - cmd.Parameters.Add("AddressBookPolicy", adpstring); + //update mailbox + cmd = new Command("Set-Mailbox"); + cmd.Parameters.Add("Identity", id); + cmd.Parameters.Add("OfflineAddressBook", offlineAddressBook); + cmd.Parameters.Add("EmailAddressPolicyEnabled", false); + cmd.Parameters.Add("CustomAttribute1", organizationId); + cmd.Parameters.Add("CustomAttribute3", windowsEmailAddress); + cmd.Parameters.Add("PrimarySmtpAddress", upn); + cmd.Parameters.Add("WindowsEmailAddress", upn); - cmd.Parameters.Add("UseDatabaseQuotaDefaults", new bool?(false)); - cmd.Parameters.Add("UseDatabaseRetentionDefaults", false); - cmd.Parameters.Add("IssueWarningQuota", ConvertKBToUnlimited(issueWarningKB)); - cmd.Parameters.Add("ProhibitSendQuota", ConvertKBToUnlimited(prohibitSendKB)); - cmd.Parameters.Add("ProhibitSendReceiveQuota", ConvertKBToUnlimited(prohibitSendReceiveKB)); - cmd.Parameters.Add("RetainDeletedItemsFor", ConvertDaysToEnhancedTimeSpan(keepDeletedItemsDays)); - ExecuteShellCommand(runSpace, cmd); + cmd.Parameters.Add("UseDatabaseQuotaDefaults", new bool?(false)); + cmd.Parameters.Add("UseDatabaseRetentionDefaults", false); + cmd.Parameters.Add("IssueWarningQuota", ConvertKBToUnlimited(issueWarningKB)); + cmd.Parameters.Add("ProhibitSendQuota", ConvertKBToUnlimited(prohibitSendKB)); + cmd.Parameters.Add("ProhibitSendReceiveQuota", ConvertKBToUnlimited(prohibitSendReceiveKB)); + cmd.Parameters.Add("RetainDeletedItemsFor", ConvertDaysToEnhancedTimeSpan(keepDeletedItemsDays)); + cmd.Parameters.Add("RecipientLimits", ConvertInt32ToUnlimited(maxRecipients)); + cmd.Parameters.Add("MaxSendSize", ConvertKBToUnlimited(maxSendMessageSizeKB)); + cmd.Parameters.Add("MaxReceiveSize", ConvertKBToUnlimited(maxReceiveMessageSizeKB)); + cmd.Parameters.Add("HiddenFromAddressListsEnabled", hideFromAddressBook); + ExecuteShellCommand(runSpace, cmd); + //update AD object + string globalAddressListName = this.GetGlobalAddressListName(organizationId); + string globalAddressListDN = this.GetGlobalAddressListDN(runSpace, globalAddressListName); + string path = AddADPrefix(id); + DirectoryEntry mailbox = GetADObject(path); + // check if msExchQueryBaseDN must be cleared for Exchange 2010 SP1 + bool clearQueryBaseDN = false; + if (ConfigurationManager.AppSettings[CONFIG_CLEAR_QUERYBASEDN] != null) + clearQueryBaseDN = Boolean.Parse(ConfigurationManager.AppSettings[CONFIG_CLEAR_QUERYBASEDN]); - //update AD object - string globalAddressListName = this.GetGlobalAddressListName(organizationId); - string globalAddressListDN = this.GetGlobalAddressListDN(runSpace, globalAddressListName); - string path = AddADPrefix(id); - DirectoryEntry mailbox = GetADObject(path); + if (!(clearQueryBaseDN && (exchangeVersion >= new Version(14, 1)))) + SetADObjectPropertyValue(mailbox, "msExchQueryBaseDN", globalAddressListDN); - // check if msExchQueryBaseDN must be cleared for Exchange 2010 SP1 - bool clearQueryBaseDN = false; - if (ConfigurationManager.AppSettings[CONFIG_CLEAR_QUERYBASEDN] != null) - clearQueryBaseDN = Boolean.Parse(ConfigurationManager.AppSettings[CONFIG_CLEAR_QUERYBASEDN]); + //SetADObjectPropertyValue(mailbox, "msExchUseOAB", offlineAddressBook); + mailbox.CommitChanges(); + mailbox.Close(); - if (!(clearQueryBaseDN && (exchangeVersion >= new Version(14, 1)))) - SetADObjectPropertyValue(mailbox, "msExchQueryBaseDN", globalAddressListDN); + //Client Access + cmd = new Command("Set-CASMailbox"); + cmd.Parameters.Add("Identity", id); + cmd.Parameters.Add("ActiveSyncEnabled", enableActiveSync); + if (enableActiveSync) + { + cmd.Parameters.Add("ActiveSyncMailboxPolicy", organizationId); + } + cmd.Parameters.Add("OWAEnabled", enableOWA); + cmd.Parameters.Add("MAPIEnabled", enableMAPI); + cmd.Parameters.Add("PopEnabled", enablePOP); + cmd.Parameters.Add("ImapEnabled", enableIMAP); + ExecuteShellCommand(runSpace, cmd); - //SetADObjectPropertyValue(mailbox, "msExchUseOAB", offlineAddressBook); - mailbox.CommitChanges(); - mailbox.Close(); + //calendar settings + if (accountType == ExchangeAccountType.Equipment || accountType == ExchangeAccountType.Room) + { + //SetCalendarSettings(runSpace, id); + } - //Client Access - cmd = new Command("Set-CASMailbox"); - cmd.Parameters.Add("Identity", id); - cmd.Parameters.Add("ActiveSyncEnabled", enableActiveSync); - if (enableActiveSync) - { - cmd.Parameters.Add("ActiveSyncMailboxPolicy", organizationId); - } - cmd.Parameters.Add("OWAEnabled", enableOWA); - cmd.Parameters.Add("MAPIEnabled", enableMAPI); - cmd.Parameters.Add("PopEnabled", enablePOP); - cmd.Parameters.Add("ImapEnabled", enableIMAP); - ExecuteShellCommand(runSpace, cmd); - - //calendar settings - if (accountType == ExchangeAccountType.Equipment || accountType == ExchangeAccountType.Room) - { - SetCalendarSettings(runSpace, id); - } - - ret = string.Format("{0}\\{1}", GetNETBIOSDomainName(), accountName); - ExchangeLog.LogEnd("CreateMailEnableUserInternal"); - return ret; - } - catch (Exception ex) - { - ExchangeLog.LogError("CreateMailEnableUserInternal", ex); - RollbackTransaction(transaction); - throw; - } - finally - { - CloseRunspace(runSpace); - } - } + ret = string.Format("{0}\\{1}", GetNETBIOSDomainName(), accountName); + ExchangeLog.LogEnd("CreateMailEnableUserInternal"); + return ret; + } + catch (Exception ex) + { + ExchangeLog.LogError("CreateMailEnableUserInternal", ex); + RollbackTransaction(transaction); + throw; + } + finally + { + CloseRunspace(runSpace); + } + } + /* private string CreateMailboxInternal(string organizationId, string organizationDistinguishedName, string mailboxDatabase, string securityGroup, string offlineAddressBook, ExchangeAccountType accountType, string displayName, @@ -2074,7 +2042,7 @@ namespace WebsitePanel.Providers.HostedSolution CloseRunspace(runSpace); } } - +*/ internal virtual void SetCalendarSettings(Runspace runspace, string id) { ExchangeLog.LogStart("SetCalendarSettings"); @@ -2085,7 +2053,7 @@ namespace WebsitePanel.Providers.HostedSolution ExchangeLog.LogEnd("SetCalendarSettings"); } - private void DeleteMailboxInternal(string accountName) + internal virtual void DeleteMailboxInternal(string accountName) { ExchangeLog.LogStart("DeleteMailboxInternal"); ExchangeLog.DebugInfo("Account Name: {0}", accountName); @@ -2105,7 +2073,7 @@ namespace WebsitePanel.Providers.HostedSolution ExchangeLog.LogEnd("DeleteMailboxInternal"); } - private void RemoveMailbox(Runspace runSpace, string id) + internal void RemoveMailbox(Runspace runSpace, string id) { ExchangeLog.LogStart("RemoveMailbox"); Command cmd = new Command("Remove-Mailbox"); @@ -2116,6 +2084,16 @@ namespace WebsitePanel.Providers.HostedSolution ExchangeLog.LogEnd("RemoveMailbox"); } + private void DisableMailbox(Runspace runSpace, string id) + { + ExchangeLog.LogStart("DisableMailbox"); + Command cmd = new Command("Disable-Mailbox"); + cmd.Parameters.Add("Identity", id); + cmd.Parameters.Add("Confirm", false); + ExecuteShellCommand(runSpace, cmd); + ExchangeLog.LogEnd("DisableMailbox"); + } + private string GetMailboxCommonName(Runspace runSpace, string accountName) { ExchangeLog.LogStart("GetMailboxCommonName"); @@ -2212,71 +2190,39 @@ namespace WebsitePanel.Providers.HostedSolution } - private void SetMailboxGeneralSettingsInternal(string accountName, string displayName, string password, - bool hideFromAddressBook, bool disabled, string firstName, string initials, string lastName, - string address, string city, string state, string zip, string country, string jobTitle, - string company, string department, string office, string managerAccountName, string businessPhone, - string fax, string homePhone, string mobilePhone, string pager, string webPage, string notes) - { - ExchangeLog.LogStart("SetMailboxGeneralSettingsInternal"); - ExchangeLog.DebugInfo("Account: {0}", accountName); + private void SetMailboxGeneralSettingsInternal(string accountName, bool hideFromAddressBook, bool disabled) + { + ExchangeLog.LogStart("SetMailboxGeneralSettingsInternal"); + ExchangeLog.DebugInfo("Account: {0}", accountName); - Runspace runSpace = null; - try - { - runSpace = OpenRunspace(); + Runspace runSpace = null; + try + { + runSpace = OpenRunspace(); - Collection result = GetMailboxObject(runSpace, accountName); - PSObject mailbox = result[0]; + Collection result = GetMailboxObject(runSpace, accountName); + PSObject mailbox = result[0]; - string id = GetResultObjectDN(result); - string path = AddADPrefix(id); - DirectoryEntry entry = GetADObject(path); - entry.InvokeSet("AccountDisabled", disabled); - if (!string.IsNullOrEmpty(password)) - entry.Invoke("SetPassword", password); - entry.CommitChanges(); + string id = GetResultObjectDN(result); + string path = AddADPrefix(id); + DirectoryEntry entry = GetADObject(path); + entry.InvokeSet("AccountDisabled", disabled); + entry.CommitChanges(); - Command cmd = new Command("Set-Mailbox"); - cmd.Parameters.Add("Identity", accountName); - cmd.Parameters.Add("DisplayName", displayName); - cmd.Parameters.Add("HiddenFromAddressListsEnabled", hideFromAddressBook); - cmd.Parameters.Add("CustomAttribute2", (disabled ? "disabled" : null)); - ExecuteShellCommand(runSpace, cmd); + Command cmd = new Command("Set-Mailbox"); + cmd.Parameters.Add("Identity", accountName); + cmd.Parameters.Add("HiddenFromAddressListsEnabled", hideFromAddressBook); + cmd.Parameters.Add("CustomAttribute2", (disabled ? "disabled" : null)); + ExecuteShellCommand(runSpace, cmd); - cmd = new Command("Set-User"); - cmd.Parameters.Add("Identity", accountName); - cmd.Parameters.Add("FirstName", firstName); - cmd.Parameters.Add("Initials", initials); - cmd.Parameters.Add("LastName", lastName); - cmd.Parameters.Add("StreetAddress", address); - cmd.Parameters.Add("City", city); - cmd.Parameters.Add("StateOrProvince", state); - cmd.Parameters.Add("PostalCode", zip); - cmd.Parameters.Add("CountryOrRegion", ParseCountryInfo(country)); - cmd.Parameters.Add("Title", jobTitle); - cmd.Parameters.Add("Company", company); - cmd.Parameters.Add("Department", department); - cmd.Parameters.Add("Office", office); - cmd.Parameters.Add("Manager", managerAccountName); - cmd.Parameters.Add("Phone", businessPhone); - cmd.Parameters.Add("Fax", fax); - cmd.Parameters.Add("HomePhone", homePhone); - cmd.Parameters.Add("MobilePhone", mobilePhone); - cmd.Parameters.Add("Pager", pager); - cmd.Parameters.Add("WebPage", webPage); - cmd.Parameters.Add("Notes", notes); + } + finally + { - ExecuteShellCommand(runSpace, cmd); - - } - finally - { - - CloseRunspace(runSpace); - } - ExchangeLog.LogEnd("SetMailboxGeneralSettingsInternal"); - } + CloseRunspace(runSpace); + } + ExchangeLog.LogEnd("SetMailboxGeneralSettingsInternal"); + } private void ChangeMailboxState(string id, bool enabled) { @@ -2334,62 +2280,58 @@ namespace WebsitePanel.Providers.HostedSolution return info; } - private void SetMailboxMailFlowSettingsInternal(string accountName, bool enableForwarding, - string forwardingAccountName, bool forwardToBoth, string[] sendOnBehalfAccounts, - string[] acceptAccounts, string[] rejectAccounts, int maxRecipients, int maxSendMessageSizeKB, - int maxReceiveMessageSizeKB, bool requireSenderAuthentication) - { - ExchangeLog.LogStart("SetMailboxMailFlowSettingsInternal"); - ExchangeLog.DebugInfo("Account: {0}", accountName); + private void SetMailboxMailFlowSettingsInternal(string accountName, bool enableForwarding, + string forwardingAccountName, bool forwardToBoth, string[] sendOnBehalfAccounts, + string[] acceptAccounts, string[] rejectAccounts, bool requireSenderAuthentication) + { + ExchangeLog.LogStart("SetMailboxMailFlowSettingsInternal"); + ExchangeLog.DebugInfo("Account: {0}", accountName); - Runspace runSpace = null; - try - { - runSpace = OpenRunspace(); + Runspace runSpace = null; + try + { + runSpace = OpenRunspace(); - Command cmd = new Command("Set-Mailbox"); - cmd.Parameters.Add("Identity", accountName); + Command cmd = new Command("Set-Mailbox"); + cmd.Parameters.Add("Identity", accountName); - if (enableForwarding) - { - cmd.Parameters.Add("ForwardingAddress", forwardingAccountName); - cmd.Parameters.Add("DeliverToMailboxAndForward", forwardToBoth); - } - else - { - cmd.Parameters.Add("ForwardingAddress", null); - cmd.Parameters.Add("DeliverToMailboxAndForward", false); - } + if (enableForwarding) + { + cmd.Parameters.Add("ForwardingAddress", forwardingAccountName); + cmd.Parameters.Add("DeliverToMailboxAndForward", forwardToBoth); + } + else + { + cmd.Parameters.Add("ForwardingAddress", null); + cmd.Parameters.Add("DeliverToMailboxAndForward", false); + } - cmd.Parameters.Add("GrantSendOnBehalfTo", SetSendOnBehalfAccounts(runSpace, sendOnBehalfAccounts)); + cmd.Parameters.Add("GrantSendOnBehalfTo", SetSendOnBehalfAccounts(runSpace, sendOnBehalfAccounts)); - MultiValuedProperty ids = null; - MultiValuedProperty dlIds = null; + MultiValuedProperty ids = null; + MultiValuedProperty dlIds = null; - SetAccountIds(runSpace, acceptAccounts, out ids, out dlIds); - cmd.Parameters.Add("AcceptMessagesOnlyFrom", ids); - cmd.Parameters.Add("AcceptMessagesOnlyFromDLMembers", dlIds); + SetAccountIds(runSpace, acceptAccounts, out ids, out dlIds); + cmd.Parameters.Add("AcceptMessagesOnlyFrom", ids); + cmd.Parameters.Add("AcceptMessagesOnlyFromDLMembers", dlIds); - SetAccountIds(runSpace, rejectAccounts, out ids, out dlIds); - cmd.Parameters.Add("RejectMessagesFrom", ids); - cmd.Parameters.Add("RejectMessagesFromDLMembers", dlIds); + SetAccountIds(runSpace, rejectAccounts, out ids, out dlIds); + cmd.Parameters.Add("RejectMessagesFrom", ids); + cmd.Parameters.Add("RejectMessagesFromDLMembers", dlIds); - cmd.Parameters.Add("RecipientLimits", ConvertInt32ToUnlimited(maxRecipients)); - cmd.Parameters.Add("MaxSendSize", ConvertKBToUnlimited(maxSendMessageSizeKB)); - cmd.Parameters.Add("MaxReceiveSize", ConvertKBToUnlimited(maxReceiveMessageSizeKB)); - cmd.Parameters.Add("RequireSenderAuthenticationEnabled", requireSenderAuthentication); + cmd.Parameters.Add("RequireSenderAuthenticationEnabled", requireSenderAuthentication); - ExecuteShellCommand(runSpace, cmd); + ExecuteShellCommand(runSpace, cmd); - } - finally - { + } + finally + { - CloseRunspace(runSpace); - } - ExchangeLog.LogEnd("SetMailboxMailFlowSettingsInternal"); - } + CloseRunspace(runSpace); + } + ExchangeLog.LogEnd("SetMailboxMailFlowSettingsInternal"); + } private ExchangeMailbox GetMailboxAdvancedSettingsInternal(string accountName) { @@ -2464,48 +2406,52 @@ namespace WebsitePanel.Providers.HostedSolution return info; } - private void SetMailboxAdvancedSettingsInternal(string organizationId, string accountName, bool enablePOP, bool enableIMAP, - bool enableOWA, bool enableMAPI, bool enableActiveSync, int issueWarningKB, int prohibitSendKB, - int prohibitSendReceiveKB, int keepDeletedItemsDays) - { - ExchangeLog.LogStart("SetMailboxAdvancedSettingsInternal"); - ExchangeLog.DebugInfo("Account: {0}", accountName); + private void SetMailboxAdvancedSettingsInternal(string organizationId, string accountName, bool enablePOP, bool enableIMAP, + bool enableOWA, bool enableMAPI, bool enableActiveSync, int issueWarningKB, int prohibitSendKB, + int prohibitSendReceiveKB, int keepDeletedItemsDays, int maxRecipients, int maxSendMessageSizeKB, + int maxReceiveMessageSizeKB) + { + ExchangeLog.LogStart("SetMailboxAdvancedSettingsInternal"); + ExchangeLog.DebugInfo("Account: {0}", accountName); - Runspace runSpace = null; - try - { - runSpace = OpenRunspace(); + Runspace runSpace = null; + try + { + runSpace = OpenRunspace(); - Command cmd = new Command("Set-Mailbox"); - cmd.Parameters.Add("Identity", accountName); - cmd.Parameters.Add("IssueWarningQuota", ConvertKBToUnlimited(issueWarningKB)); - cmd.Parameters.Add("ProhibitSendQuota", ConvertKBToUnlimited(prohibitSendKB)); - cmd.Parameters.Add("ProhibitSendReceiveQuota", ConvertKBToUnlimited(prohibitSendReceiveKB)); - cmd.Parameters.Add("RetainDeletedItemsFor", ConvertDaysToEnhancedTimeSpan(keepDeletedItemsDays)); - ExecuteShellCommand(runSpace, cmd); + Command cmd = new Command("Set-Mailbox"); + cmd.Parameters.Add("Identity", accountName); + cmd.Parameters.Add("IssueWarningQuota", ConvertKBToUnlimited(issueWarningKB)); + cmd.Parameters.Add("ProhibitSendQuota", ConvertKBToUnlimited(prohibitSendKB)); + cmd.Parameters.Add("ProhibitSendReceiveQuota", ConvertKBToUnlimited(prohibitSendReceiveKB)); + cmd.Parameters.Add("RetainDeletedItemsFor", ConvertDaysToEnhancedTimeSpan(keepDeletedItemsDays)); + cmd.Parameters.Add("RecipientLimits", ConvertInt32ToUnlimited(maxRecipients)); + cmd.Parameters.Add("MaxSendSize", ConvertKBToUnlimited(maxSendMessageSizeKB)); + cmd.Parameters.Add("MaxReceiveSize", ConvertKBToUnlimited(maxReceiveMessageSizeKB)); + ExecuteShellCommand(runSpace, cmd); - //Client Access - cmd = new Command("Set-CASMailbox"); - cmd.Parameters.Add("Identity", accountName); - cmd.Parameters.Add("ActiveSyncEnabled", enableActiveSync); - if (enableActiveSync) - { - cmd.Parameters.Add("ActiveSyncMailboxPolicy", organizationId); - } - cmd.Parameters.Add("OWAEnabled", enableOWA); - cmd.Parameters.Add("MAPIEnabled", enableMAPI); - cmd.Parameters.Add("PopEnabled", enablePOP); - cmd.Parameters.Add("ImapEnabled", enableIMAP); - ExecuteShellCommand(runSpace, cmd); - } - finally - { + //Client Access + cmd = new Command("Set-CASMailbox"); + cmd.Parameters.Add("Identity", accountName); + cmd.Parameters.Add("ActiveSyncEnabled", enableActiveSync); + if (enableActiveSync) + { + cmd.Parameters.Add("ActiveSyncMailboxPolicy", organizationId); + } + cmd.Parameters.Add("OWAEnabled", enableOWA); + cmd.Parameters.Add("MAPIEnabled", enableMAPI); + cmd.Parameters.Add("PopEnabled", enablePOP); + cmd.Parameters.Add("ImapEnabled", enableIMAP); + ExecuteShellCommand(runSpace, cmd); + } + finally + { - CloseRunspace(runSpace); - } - ExchangeLog.LogEnd("SetMailboxAdvancedSettingsInternal"); - } + CloseRunspace(runSpace); + } + ExchangeLog.LogEnd("SetMailboxAdvancedSettingsInternal"); + } private ExchangeEmailAddress[] GetMailboxEmailAddressesInternal(string accountName) { @@ -3267,7 +3213,7 @@ namespace WebsitePanel.Providers.HostedSolution return id; } - private string EnableMailSecurityDistributionGroup(Runspace runSpace, string distName, string groupName) + internal string EnableMailSecurityDistributionGroup(Runspace runSpace, string distName, string groupName) { ExchangeLog.LogStart("EnableMailSecurityDistributionGroup"); ExchangeLog.DebugInfo("Group Distinguished Name: {0}", distName); @@ -3312,7 +3258,7 @@ namespace WebsitePanel.Providers.HostedSolution return securityGroupId; } - private void DisableMailSecurityDistributionGroup(Runspace runSpace, string id) + internal void DisableMailSecurityDistributionGroup(Runspace runSpace, string id) { ExchangeLog.LogStart("DisableMailSecurityDistributionGroup"); ExchangeLog.DebugInfo("Group Id: {0}", id); @@ -3324,7 +3270,7 @@ namespace WebsitePanel.Providers.HostedSolution } - private void UpdateSecurityDistributionGroup(Runspace runSpace, string id, string groupName) + internal void UpdateSecurityDistributionGroup(Runspace runSpace, string id, string groupName, bool isConsumer) { ExchangeLog.LogStart("UpdateSecurityDistributionGroup"); @@ -3332,21 +3278,22 @@ namespace WebsitePanel.Providers.HostedSolution cmd.Parameters.Add("Identity", id); cmd.Parameters.Add("EmailAddressPolicyEnabled", false); cmd.Parameters.Add("CustomAttribute1", groupName); - cmd.Parameters.Add("HiddenFromAddressListsEnabled", true); + cmd.Parameters.Add("HiddenFromAddressListsEnabled", !isConsumer); ExecuteShellCommand(runSpace, cmd); ExchangeLog.LogEnd("UpdateSecurityDistributionGroup"); } - private void CreateDistributionListInternal( - string organizationId, - string organizationDistinguishedName, - string displayName, - string accountName, - string name, - string domain, - string managedBy) - { + private void CreateDistributionListInternal( + string organizationId, + string organizationDistinguishedName, + string displayName, + string accountName, + string name, + string domain, + string managedBy, + string[] addressLists) + { ExchangeLog.LogStart("CreateDistributionListInternal"); ExchangeLog.DebugInfo("Organization Id: {0}", organizationId); ExchangeLog.DebugInfo("Name: {0}", name); @@ -3395,6 +3342,11 @@ namespace WebsitePanel.Providers.HostedSolution cmd.Parameters.Add("WindowsEmailAddress", email); cmd.Parameters.Add("RequireSenderAuthenticationEnabled", false); ExecuteShellCommand(runSpace, cmd); + + //fix showInAddressBook Attribute + if (addressLists.Length > 0) + FixShowInAddressBook(runSpace, email, addressLists); + } catch (Exception ex) { @@ -3410,6 +3362,23 @@ namespace WebsitePanel.Providers.HostedSolution ExchangeLog.LogEnd("CreateDistributionListInternal"); } + private void FixShowInAddressBook(Runspace runSpace, string accountName, string[] addressLists) + { + Command cmd = new Command("Get-DistributionGroup"); + cmd.Parameters.Add("Identity", accountName); + + Collection result = ExecuteShellCommand(runSpace, cmd); + string id = GetResultObjectDN(result); + + DirectoryEntry dlDEEntry = GetADObject(AddADPrefix(id)); + dlDEEntry.Properties["showInAddressBook"].Clear(); + foreach (string addressList in addressLists) + { + dlDEEntry.Properties["showInAddressBook"].Add(addressList); + } + dlDEEntry.CommitChanges(); + } + private void DeleteDistributionListInternal(string accountName) { ExchangeLog.LogStart("DeleteDistributionListInternal"); @@ -3490,9 +3459,9 @@ namespace WebsitePanel.Providers.HostedSolution return ObjToString(GetPSObjectProperty(group, "ManagedBy")); } - private void SetDistributionListGeneralSettingsInternal(string accountName, string displayName, - bool hideFromAddressBook, string managedBy, string[] memberAccounts, string notes) - { + private void SetDistributionListGeneralSettingsInternal(string accountName, string displayName, + bool hideFromAddressBook, string managedBy, string[] memberAccounts, string notes, string[] addressLists) + { ExchangeLog.LogStart("SetDistributionListGeneralSettingsInternal"); ExchangeLog.DebugInfo("Account: {0}", accountName); @@ -3561,6 +3530,10 @@ namespace WebsitePanel.Providers.HostedSolution { AddADPermission(runSpace, accountName, managedBy, "WriteProperty", null, "Member"); } + + if (addressLists.Length > 0) + FixShowInAddressBook(runSpace, accountName, addressLists); + } finally { @@ -3605,7 +3578,7 @@ namespace WebsitePanel.Providers.HostedSolution } - private void AddDistributionListMembersInternal(string accountName, string[] memberAccounts) + private void AddDistributionListMembersInternal(string accountName, string[] memberAccounts, string[] addressLists) { ExchangeLog.LogStart("AddDistributionListMembersInternal"); ExchangeLog.DebugInfo("Account: {0}", accountName); @@ -3624,8 +3597,13 @@ namespace WebsitePanel.Providers.HostedSolution cmd = new Command("Add-DistributionGroupMember"); cmd.Parameters.Add("Identity", accountName); cmd.Parameters.Add("Member", member); + cmd.Parameters.Add("BypassSecurityGroupManagerCheck", true); ExecuteShellCommand(runSpace, cmd); } + + if (addressLists.Length > 0) + FixShowInAddressBook(runSpace, accountName, addressLists); + } finally { @@ -3636,7 +3614,7 @@ namespace WebsitePanel.Providers.HostedSolution ExchangeLog.LogEnd("AddDistributionListMembersInternal"); } - private void RemoveDistributionListMembersInternal(string accountName, string[] memberAccounts) + private void RemoveDistributionListMembersInternal(string accountName, string[] memberAccounts, string[] addressLists) { ExchangeLog.LogStart("RemoveDistributionListMembersInternal"); ExchangeLog.DebugInfo("Account: {0}", accountName); @@ -3658,6 +3636,10 @@ namespace WebsitePanel.Providers.HostedSolution cmd.Parameters.Add("Confirm", false); ExecuteShellCommand(runSpace, cmd); } + + if (addressLists.Length > 0) + FixShowInAddressBook(runSpace, accountName, addressLists); + } finally { @@ -3698,9 +3680,9 @@ namespace WebsitePanel.Providers.HostedSolution return info; } - private void SetDistributionListMailFlowSettingsInternal(string accountName, - string[] acceptAccounts, string[] rejectAccounts, bool requireSenderAuthentication) - { + private void SetDistributionListMailFlowSettingsInternal(string accountName, + string[] acceptAccounts, string[] rejectAccounts, bool requireSenderAuthentication, string[] addressLists) + { ExchangeLog.LogStart("SetDistributionListMailFlowSettingsInternal"); ExchangeLog.DebugInfo("Account: {0}", accountName); @@ -3727,6 +3709,9 @@ namespace WebsitePanel.Providers.HostedSolution ExecuteShellCommand(runSpace, cmd); + if (addressLists.Length > 0) + FixShowInAddressBook(runSpace, accountName, addressLists); + } finally { @@ -3809,7 +3794,7 @@ namespace WebsitePanel.Providers.HostedSolution return list.ToArray(); } - private void SetDistributionListEmailAddressesInternal(string accountName, string[] emailAddresses) + private void SetDistributionListEmailAddressesInternal(string accountName, string[] emailAddresses, string[] addressLists) { ExchangeLog.LogStart("SetDistributionListEmailAddressesInternal"); ExchangeLog.DebugInfo("Account: {0}", accountName); @@ -3859,6 +3844,9 @@ namespace WebsitePanel.Providers.HostedSolution cmd.Parameters.Add("WindowsEmailAddress", primaryEmail); } ExecuteShellCommand(runSpace, cmd); + + if (addressLists.Length > 0) + FixShowInAddressBook(runSpace, accountName, addressLists); } finally { @@ -3868,7 +3856,7 @@ namespace WebsitePanel.Providers.HostedSolution ExchangeLog.LogEnd("SetDistributionListEmailAddressesInternal"); } - private void SetDistributionListPrimaryEmailAddressInternal(string accountName, string emailAddress) + private void SetDistributionListPrimaryEmailAddressInternal(string accountName, string emailAddress, string[] addressLists) { ExchangeLog.LogStart("SetDistributionListPrimaryEmailAddressInternal"); ExchangeLog.DebugInfo("Account: {0}", accountName); @@ -3886,6 +3874,8 @@ namespace WebsitePanel.Providers.HostedSolution cmd.Parameters.Add("WindowsEmailAddress", primaryEmail); ExecuteShellCommand(runSpace, cmd); + + } finally { @@ -3941,7 +3931,7 @@ namespace WebsitePanel.Providers.HostedSolution return exchangeDistributionList; } - private void SetDistributionListPermissionsInternal(string organizationId, string accountName, string[] sendAsAccounts, string[] sendOnBehalfAccounts) + private void SetDistributionListPermissionsInternal(string organizationId, string accountName, string[] sendAsAccounts, string[] sendOnBehalfAccounts, string[] addressLists) { ExchangeLog.LogStart("SetDistributionListPermissionsInternal"); @@ -3964,6 +3954,9 @@ namespace WebsitePanel.Providers.HostedSolution SetSendAsPermissions(runspace, distributionList.SendAsAccounts, cn, sendAsAccounts); SetDistributionListSendOnBehalfAccounts(runspace, accountName, sendOnBehalfAccounts); + if (addressLists.Length > 0) + FixShowInAddressBook(runspace, accountName, addressLists); + } catch (Exception ex) { @@ -4760,7 +4753,7 @@ namespace WebsitePanel.Providers.HostedSolution return resultObjectDN; } - private string CreateAddressList(Runspace runSpace, string organizationId) + internal string CreateAddressList(Runspace runSpace, string organizationId) { ExchangeLog.LogStart("CreateAddressList"); string addressListName = this.GetAddressListName(organizationId); @@ -4812,7 +4805,60 @@ namespace WebsitePanel.Providers.HostedSolution return addressListDN; } - private void UpdateAddressList(Runspace runSpace, string id, string securityGroup) + internal string CreateRoomsAddressList(Runspace runSpace, string organizationId) + { + ExchangeLog.LogStart("CreateRoomList"); + string addressListName = this.GetRoomsAddressListName(organizationId); + string addressListDN = this.GetAddressListDN(runSpace, addressListName); + if (!string.IsNullOrEmpty(addressListDN)) + { + //address list already exists - we will use it + ExchangeLog.LogWarning("Room List '{0}' already exists", new object[] { addressListName }); + } + else + { + //try to create a new address list (10 attempts) + int attempts = 0; + Command cmd = null; + Collection result = null; + + while (true) + { + try + { + //try to create address list + cmd = new Command("New-AddressList"); + cmd.Parameters.Add("Name", addressListName); + cmd.Parameters.Add("IncludedRecipients", "Resources"); + cmd.Parameters.Add("ConditionalCustomAttribute1", organizationId); + + result = ExecuteShellCommand(runSpace, cmd); + addressListDN = CheckResultObjectDN(result); + } + catch (Exception ex) + { + ExchangeLog.LogError(ex); + } + if (addressListDN != null) + break; + + if (attempts > 9) + throw new Exception( + string.Format("Could not create Room List '{0}' ", addressListName)); + + attempts++; + ExchangeLog.LogWarning("Attempt #{0} to create room list failed!", attempts); + // wait 1 sec + System.Threading.Thread.Sleep(1000); + } + } + + ExchangeLog.LogEnd("CreateRoomList"); + return addressListDN; + } + + + internal void UpdateAddressList(Runspace runSpace, string id, string securityGroup) { ExchangeLog.LogStart("UpdateAddressList"); @@ -4826,7 +4872,7 @@ namespace WebsitePanel.Providers.HostedSolution ExchangeLog.LogEnd("UpdateAddressList"); } - private void DeleteAddressList(Runspace runSpace, string id) + internal void DeleteAddressList(Runspace runSpace, string id) { ExchangeLog.LogStart("DeleteAddressList"); Command cmd = new Command("Remove-AddressList"); @@ -4836,116 +4882,33 @@ namespace WebsitePanel.Providers.HostedSolution ExchangeLog.LogEnd("DeleteAddressList"); } - private string GetRoomsAddressListDN(Runspace runSpace, string id) + + internal virtual void DeleteAddressBookPolicy(Runspace runSpace, string id) { - ExchangeLog.LogStart("GetRoomsAddressListDN"); + ExchangeLog.LogStart("DeleteAddressBookPolicy"); + ExchangeLog.LogEnd("DeleteAddressBookPolicy"); + } + + + + internal string GetGlobalAddressListDN(Runspace runSpace, string id) + { + ExchangeLog.LogStart("GetGlobalAddressListDN"); string resultObjectDN = null; - Command cmd = new Command("Get-AddressList"); + Command cmd = new Command("Get-GlobalAddressList"); cmd.Parameters.Add("Identity", id); Collection result = this.ExecuteShellCommand(runSpace, cmd); if ((result != null) && (result.Count > 0)) { resultObjectDN = this.GetResultObjectDN(result); - ExchangeLog.DebugInfo("RAL DN: {0}", new object[] { resultObjectDN }); + ExchangeLog.DebugInfo("GAL DN: {0}", new object[] { resultObjectDN }); } - ExchangeLog.DebugInfo("GetRommsAddressListDN, cmd = {0}", cmd.CommandText); - ExchangeLog.LogEnd("GetRoomsAddressListDN"); + ExchangeLog.LogEnd("GetGlobalAddressListDN"); return resultObjectDN; } - private string CreateRoomsAddressList(Runspace runSpace, string organizationId) - { - ExchangeLog.LogStart("CreateRoomsAddressList"); - string roomsAddressListName = this.GetRoomsAddressListName(organizationId); - string roomsAddressListDN = this.GetRoomsAddressListDN(runSpace, roomsAddressListName); - if (!string.IsNullOrEmpty(roomsAddressListDN)) - { - //rooms address list already exists - we will use it - ExchangeLog.LogWarning("Rooms Address List '{0}' already exists", new object[] { roomsAddressListName }); - } - else - { - //try to create a new rooms address list (10 attempts) - int attempts = 0; - Command cmd = null; - Collection result = null; - while (true) - { - try - { - //try to create address list - cmd = new Command("New-AddressList"); - cmd.Parameters.Add("Name", roomsAddressListName); - cmd.Parameters.Add("IncludedRecipients", "Resources"); - cmd.Parameters.Add("ConditionalCustomAttribute1", organizationId); - - result = ExecuteShellCommand(runSpace, cmd); - roomsAddressListDN = CheckResultObjectDN(result); - } - catch (Exception ex) - { - ExchangeLog.LogError(ex); - } - if (roomsAddressListDN != null) - break; - - if (attempts > 9) - throw new Exception( - string.Format("Could not create Rooms Address List '{0}' cmd = '{1}'", roomsAddressListName, cmd)); - - attempts++; - ExchangeLog.LogWarning("Attempt #{0} to create rooms address list failed!", attempts); - // wait 1 sec - System.Threading.Thread.Sleep(1000); - } - } - - ExchangeLog.LogEnd("CreateRoomsAddressList"); - return roomsAddressListDN; - } - - private void UpdateRoomsAddressList(Runspace runSpace, string id, string securityGroup) - { - ExchangeLog.LogStart("UpdateRoomsAddressList"); - - string path = AddADPrefix(id); - Command cmd = new Command("Update-AddressList"); - cmd.Parameters.Add("Identity", id); - ExecuteShellCommand(runSpace, cmd); - - AdjustADSecurity(path, securityGroup, false); - - ExchangeLog.LogEnd("UpdateRoomsAddressList"); - } - - private void DeleteRoomsAddressList(Runspace runSpace, string id) - { - ExchangeLog.LogStart("DeleteRoomsAddressList"); - Command cmd = new Command("Remove-AddressList"); - cmd.Parameters.Add("Identity", id); - cmd.Parameters.Add("Confirm", false); - ExecuteShellCommand(runSpace, cmd); - ExchangeLog.LogEnd("DeleteRoomsAddressList"); - } - - private string GetGlobalAddressListDN(Runspace runSpace, string id) - { - ExchangeLog.LogStart("GetGlobalAddressListDN"); - string resultObjectDN = null; - Command cmd = new Command("Get-GlobalAddressList"); - cmd.Parameters.Add("Identity", id); - Collection result = this.ExecuteShellCommand(runSpace, cmd); - if ((result != null) && (result.Count > 0)) - { - resultObjectDN = this.GetResultObjectDN(result); - ExchangeLog.DebugInfo("GAL DN: {0}", new object[] { resultObjectDN }); - } - ExchangeLog.LogEnd("GetGlobalAddressListDN"); - return resultObjectDN; - } - - private string CreateGlobalAddressList(Runspace runSpace, string organizationId) + internal string CreateGlobalAddressList(Runspace runSpace, string organizationId) { ExchangeLog.LogStart("CreateGlobalAddressList"); @@ -4962,7 +4925,7 @@ namespace WebsitePanel.Providers.HostedSolution return id; } - private void UpdateGlobalAddressList(Runspace runSpace, string id, string securityGroup) + internal void UpdateGlobalAddressList(Runspace runSpace, string id, string securityGroup) { ExchangeLog.LogStart("UpdateGlobalAddressList"); @@ -4977,7 +4940,7 @@ namespace WebsitePanel.Providers.HostedSolution ExchangeLog.LogEnd("UpdateGlobalAddressList"); } - private void DeleteGlobalAddressList(Runspace runSpace, string id) + internal void DeleteGlobalAddressList(Runspace runSpace, string id) { ExchangeLog.LogStart("DeleteGlobalAddressList"); Command cmd = new Command("Remove-GlobalAddressList"); @@ -4989,44 +4952,39 @@ namespace WebsitePanel.Providers.HostedSolution private string CreateOfflineAddressBook(Runspace runSpace, string organizationId, string server, string oabVirtualDirs) { - ExchangeLog.LogStart("CreateOfflineAddressBook"); + ExchangeLog.LogStart("CreateOfflineAddressBook"); - string oabName = GetOfflineAddressBookName(organizationId); + string oabName = GetOfflineAddressBookName(organizationId); + string addressListName = GetAddressListName(organizationId); - bool enableSP2abp = false; - if (ConfigurationManager.AppSettings[CONFIG_ENABLESP2ABP] != null) - enableSP2abp = Boolean.Parse(ConfigurationManager.AppSettings[CONFIG_ENABLESP2ABP]); - Version exchangeVersion = GetExchangeVersion(); - string addressListName; - if (enableSP2abp && (exchangeVersion >= new Version(14, 2))) - { - // Ex2010SP2 with ABP support, want to use GAL for OAB - addressListName = GetGlobalAddressListName(organizationId); - } - else - { - // Ex2007 or Ex2010 without ABP support, have to use AL for OAB - addressListName = GetAddressListName(organizationId); - } + Command cmd = new Command("New-OfflineAddressBook"); + cmd.Parameters.Add("Name", oabName); + cmd.Parameters.Add("Server", server); + cmd.Parameters.Add("AddressLists", addressListName); + cmd.Parameters.Add("PublicFolderDistributionEnabled", PublicFolderDistributionEnabled); + cmd.Parameters.Add("IsDefault", false); - Command cmd = new Command("New-OfflineAddressBook"); - cmd.Parameters.Add("Name", oabName); - cmd.Parameters.Add("Server", server); - cmd.Parameters.Add("AddressLists", addressListName); - cmd.Parameters.Add("PublicFolderDistributionEnabled", true); - cmd.Parameters.Add("IsDefault", false); - if (!string.IsNullOrEmpty(oabVirtualDirs)) - { - cmd.Parameters.Add("VirtualDirectories", oabVirtualDirs); - } - Collection result = ExecuteShellCommand(runSpace, cmd); - string id = GetResultObjectDN(result); + //TODO: fix web distribution + if (!string.IsNullOrEmpty(oabVirtualDirs)) + { + ArrayList virtualDirs = new ArrayList(); + string[] strTmp = oabVirtualDirs.Split(','); + foreach (string s in strTmp) + { + virtualDirs.Add(s); + } - ExchangeLog.LogEnd("CreateOfflineAddressBook"); + cmd.Parameters.Add("VirtualDirectories", (String[])virtualDirs.ToArray(typeof(string))); + } - return id; - } + Collection result = ExecuteShellCommand(runSpace, cmd); + string id = GetResultObjectDN(result); + + ExchangeLog.LogEnd("CreateOfflineAddressBook"); + + return id; + } private void UpdateOfflineAddressBook(Runspace runSpace, string id, string securityGroup) { @@ -5044,7 +5002,7 @@ namespace WebsitePanel.Providers.HostedSolution } - private void DeleteOfflineAddressBook(Runspace runSpace, string id) + internal void DeleteOfflineAddressBook(Runspace runSpace, string id) { ExchangeLog.LogStart("DeleteOfflineAddressBook"); Command cmd = new Command("Remove-OfflineAddressBook"); @@ -5054,31 +5012,6 @@ namespace WebsitePanel.Providers.HostedSolution ExchangeLog.LogEnd("DeleteOfflineAddressBook"); } - private string CreateAddressPolicy(Runspace runSpace, string organizationId) - { - ExchangeLog.LogStart("CreateAddressPolicy"); - - string ABP = GetAddressPolicyName(organizationId); - string AL = GetAddressListName(organizationId); - string GAL = GetGlobalAddressListName(organizationId); - string OAB = GetOfflineAddressBookName(organizationId); - string RL = GetRoomsAddressListName(organizationId); - - Command cmd = new Command("New-AddressBookPolicy"); - cmd.Parameters.Add("Name", ABP); - cmd.Parameters.Add("GlobalAddressList", GAL); - cmd.Parameters.Add("OfflineAddressBook", OAB); - cmd.Parameters.Add("AddressLists", AL); - cmd.Parameters.Add("RoomList", RL); - - - Collection result = ExecuteShellCommand(runSpace, cmd); - string id = GetResultObjectDN(result); - - ExchangeLog.LogEnd("CreateAddressPolicy"); - return id; - } - private void DeleteAddressPolicy(Runspace runSpace, string id) { ExchangeLog.LogStart("DeleteAddressPolicy"); @@ -5094,7 +5027,7 @@ namespace WebsitePanel.Providers.HostedSolution return orgName + " Address List"; } - private string GetGlobalAddressListName(string orgName) + internal string GetGlobalAddressListName(string orgName) { return orgName + " Global Address List"; } @@ -5103,7 +5036,8 @@ namespace WebsitePanel.Providers.HostedSolution { return orgName + " Offline Address Book"; } - private string GetAddressPolicyName(string orgName) + + internal string GetAddressBookPolicyName(string orgName) { return orgName + " Address Policy"; } @@ -5162,7 +5096,7 @@ namespace WebsitePanel.Providers.HostedSolution ExchangeLog.LogEnd("DeleteADObject"); } - private DirectoryEntry GetRootOU() + private DirectoryEntry GetRootOU() { ExchangeLog.LogStart("GetRootOU"); StringBuilder sb = new StringBuilder(); @@ -5177,7 +5111,7 @@ namespace WebsitePanel.Providers.HostedSolution return de; } - private void SetADObjectProperty(DirectoryEntry oDE, string name, string value) + private void SetADObjectProperty(DirectoryEntry oDE, string name, string value) { if (!string.IsNullOrEmpty(value)) { @@ -5192,14 +5126,14 @@ namespace WebsitePanel.Providers.HostedSolution } } - private void SetADObjectPropertyValue(DirectoryEntry oDE, string name, string value) + internal void SetADObjectPropertyValue(DirectoryEntry oDE, string name, string value) { PropertyValueCollection collection = oDE.Properties[name]; collection.Value = value; } - private void AddADObjectProperty(DirectoryEntry oDE, string name, string value) + internal void AddADObjectProperty(DirectoryEntry oDE, string name, string value) { if (!string.IsNullOrEmpty(value)) { @@ -5208,7 +5142,7 @@ namespace WebsitePanel.Providers.HostedSolution } } - private DirectoryEntry GetADObject(string path) + internal DirectoryEntry GetADObject(string path) { DirectoryEntry de = null; if (path.StartsWith("LDAP://" + PrimaryDomainController + "/", true, CultureInfo.InvariantCulture)) @@ -5226,7 +5160,7 @@ namespace WebsitePanel.Providers.HostedSolution return de; } - private object GetADObjectProperty(DirectoryEntry entry, string name) + internal object GetADObjectProperty(DirectoryEntry entry, string name) { if (entry.Properties.Contains(name)) return entry.Properties[name][0]; @@ -5234,6 +5168,18 @@ namespace WebsitePanel.Providers.HostedSolution return String.Empty; } + + private string GetOrganizationPath(string organizationId) + { + StringBuilder sb = new StringBuilder(); + // append provider + AppendOUPath(sb, organizationId); + AppendOUPath(sb, RootOU); + AppendDomainPath(sb, RootDomain); + + return sb.ToString(); + } + private void AppendProtocol(StringBuilder sb) { sb.Append("LDAP://"); @@ -5270,7 +5216,7 @@ namespace WebsitePanel.Providers.HostedSolution } } - private string AddADPrefix(string path) + internal string AddADPrefix(string path) { string dn = path; if (!dn.ToUpper().StartsWith("LDAP://")) @@ -5296,7 +5242,7 @@ namespace WebsitePanel.Providers.HostedSolution return dn; } - private string ConvertADPathToCanonicalName(string name) + internal string ConvertADPathToCanonicalName(string name) { if (string.IsNullOrEmpty(name)) @@ -5355,7 +5301,7 @@ namespace WebsitePanel.Providers.HostedSolution } - private void AdjustADSecurity(string objPath, string securityGroupPath, bool isAddressBook) + internal virtual void AdjustADSecurity(string objPath, string securityGroupPath, bool isAddressBook) { ExchangeLog.LogStart("AdjustADSecurity"); ExchangeLog.DebugInfo(" Active Direcory object: {0}", objPath); @@ -5487,7 +5433,7 @@ namespace WebsitePanel.Providers.HostedSolution ExchangeLog.LogEnd("AddGlobalUPNSuffix"); }*/ - private string GetNETBIOSDomainName() + internal string GetNETBIOSDomainName() { ExchangeLog.LogStart("GetNETBIOSDomainName"); string ret = string.Empty; @@ -6026,7 +5972,7 @@ namespace WebsitePanel.Providers.HostedSolution ExchangeLog.LogEnd("CreateOrganizationActiveSyncPolicyInternal"); } - private string CreateActiveSyncPolicy(Runspace runSpace, string organizationId) + internal string CreateActiveSyncPolicy(Runspace runSpace, string organizationId) { ExchangeLog.LogStart("CreateActiveSyncPolicy"); Command cmd = new Command("New-ActiveSyncMailboxPolicy"); @@ -6039,7 +5985,7 @@ namespace WebsitePanel.Providers.HostedSolution return id; } - private void DeleteActiveSyncPolicy(Runspace runSpace, string id) + internal void DeleteActiveSyncPolicy(Runspace runSpace, string id) { ExchangeLog.LogStart("DeleteActiveSyncPolicy"); Command cmd = new Command("Remove-ActiveSyncMailboxPolicy"); @@ -6175,35 +6121,43 @@ namespace WebsitePanel.Providers.HostedSolution private ExchangeMobileDevice[] GetMobileDevicesInternal(string accountName) { - ExchangeLog.LogStart("GetMobileDevicesInternal"); - ExchangeLog.DebugInfo("Account name: {0}", accountName); + ExchangeLog.LogStart("GetMobileDevicesInternal"); + ExchangeLog.DebugInfo("Account name: {0}", accountName); - List devices = new List(); - ExchangeMobileDevice device = null; + List devices = new List(); + ExchangeMobileDevice device = null; - Runspace runSpace = null; - try - { - runSpace = OpenRunspace(); - Command cmd = new Command("Get-ActiveSyncDeviceStatistics"); - cmd.Parameters.Add("Mailbox", accountName); - Collection result = ExecuteShellCommand(runSpace, cmd); + Runspace runSpace = null; + try + { + runSpace = OpenRunspace(); + Command cmd = new Command("Get-ActiveSyncDeviceStatistics"); + cmd.Parameters.Add("Mailbox", accountName); - if (result != null) - { - foreach (PSObject obj in result) - { - device = GetMobileDeviceObject(obj); - devices.Add(device); - } - } - } - finally - { - CloseRunspace(runSpace); - } - ExchangeLog.LogEnd("GetMobileDevicesInternal"); - return devices.ToArray(); + Collection result = null; + try + { + result = ExecuteShellCommand(runSpace, cmd); + } + catch (Exception) + { + } + + if (result != null) + { + foreach (PSObject obj in result) + { + device = GetMobileDeviceObject(obj); + devices.Add(device); + } + } + } + finally + { + CloseRunspace(runSpace); + } + ExchangeLog.LogEnd("GetMobileDevicesInternal"); + return devices.ToArray(); } private ExchangeMobileDevice GetMobileDeviceObject(PSObject obj) @@ -6616,7 +6570,7 @@ namespace WebsitePanel.Providers.HostedSolution return ret; } - private string GetServerName() + internal string GetServerName() { string ret = null; if (!string.IsNullOrEmpty(MailboxCluster)) @@ -6659,12 +6613,12 @@ namespace WebsitePanel.Providers.HostedSolution #region Transactions - private ExchangeTransaction StartTransaction() + internal ExchangeTransaction StartTransaction() { return new ExchangeTransaction(); } - private void RollbackTransaction(ExchangeTransaction transaction) + internal void RollbackTransaction(ExchangeTransaction transaction) { ExchangeLog.LogStart("RollbackTransaction"); Runspace runSpace = null; @@ -6703,58 +6657,61 @@ namespace WebsitePanel.Providers.HostedSolution ExchangeLog.LogInfo("Rollback action: {0}", action.ActionType); switch (action.ActionType) { - case TransactionAction.TransactionActionTypes.CreateOrganizationUnit: - DeleteADObject(action.Id); - break; - case TransactionAction.TransactionActionTypes.CreateDistributionGroup: - RemoveDistributionGroup(runspace, action.Id); - break; - case TransactionAction.TransactionActionTypes.EnableDistributionGroup: - DisableMailSecurityDistributionGroup(runspace, action.Id); - break; - case TransactionAction.TransactionActionTypes.CreateGlobalAddressList: - DeleteGlobalAddressList(runspace, action.Id); - break; - case TransactionAction.TransactionActionTypes.CreateAddressList: - DeleteAddressList(runspace, action.Id); - break; - case TransactionAction.TransactionActionTypes.CreateRoomsAddressList: - DeleteRoomsAddressList(runspace, action.Id); + case TransactionAction.TransactionActionTypes.CreateOrganizationUnit: + DeleteADObject(action.Id); break; - case TransactionAction.TransactionActionTypes.CreateOfflineAddressBook: - DeleteOfflineAddressBook(runspace, action.Id); - break; - case TransactionAction.TransactionActionTypes.CreateActiveSyncPolicy: - DeleteActiveSyncPolicy(runspace, action.Id); - break; - case TransactionAction.TransactionActionTypes.CreateAcceptedDomain: - RemoveAcceptedDomain(runspace, action.Id); - break; - case TransactionAction.TransactionActionTypes.AddUPNSuffix: - RemoveUPNSuffix(action.Id, action.Suffix); - break; - case TransactionAction.TransactionActionTypes.CreateMailbox: - RemoveMailbox(runspace, action.Id); - break; - case TransactionAction.TransactionActionTypes.CreateContact: - RemoveContact(runspace, action.Id); - break; - case TransactionAction.TransactionActionTypes.CreatePublicFolder: - RemovePublicFolder(runspace, action.Id); - break; - case TransactionAction.TransactionActionTypes.AddMailboxFullAccessPermission: - RemoveMailboxAccessPermission(runspace, action.Account, action.Id, "FullAccess"); - break; - case TransactionAction.TransactionActionTypes.AddSendAsPermission: - RemoveADPermission(runspace, action.Account, action.Id, null, "Send-as", null); - break; - case TransactionAction.TransactionActionTypes.RemoveMailboxFullAccessPermission: - SetMailboxPermission(runspace, action.Account, action.Id, "FullAccess"); - break; - case TransactionAction.TransactionActionTypes.RemoveSendAsPermission: - SetExtendedRights(runspace, action.Account, action.Id, "Send-as"); - break; - } + case TransactionAction.TransactionActionTypes.CreateDistributionGroup: + RemoveDistributionGroup(runspace, action.Id); + break; + case TransactionAction.TransactionActionTypes.EnableDistributionGroup: + DisableMailSecurityDistributionGroup(runspace, action.Id); + break; + case TransactionAction.TransactionActionTypes.CreateGlobalAddressList: + DeleteGlobalAddressList(runspace, action.Id); + break; + case TransactionAction.TransactionActionTypes.CreateAddressList: + DeleteAddressList(runspace, action.Id); + break; + case TransactionAction.TransactionActionTypes.CreateAddressBookPolicy: + DeleteAddressBookPolicy(runspace, action.Id); + break; + case TransactionAction.TransactionActionTypes.CreateOfflineAddressBook: + DeleteOfflineAddressBook(runspace, action.Id); + break; + case TransactionAction.TransactionActionTypes.CreateActiveSyncPolicy: + DeleteActiveSyncPolicy(runspace, action.Id); + break; + case TransactionAction.TransactionActionTypes.CreateAcceptedDomain: + RemoveAcceptedDomain(runspace, action.Id); + break; + case TransactionAction.TransactionActionTypes.AddUPNSuffix: + RemoveUPNSuffix(action.Id, action.Suffix); + break; + case TransactionAction.TransactionActionTypes.CreateMailbox: + RemoveMailbox(runspace, action.Id); + break; + case TransactionAction.TransactionActionTypes.EnableMailbox: + DisableMailbox(runspace, action.Id); + break; + case TransactionAction.TransactionActionTypes.CreateContact: + RemoveContact(runspace, action.Id); + break; + case TransactionAction.TransactionActionTypes.CreatePublicFolder: + RemovePublicFolder(runspace, action.Id); + break; + case TransactionAction.TransactionActionTypes.AddMailboxFullAccessPermission: + RemoveMailboxAccessPermission(runspace, action.Account, action.Id, "FullAccess"); + break; + case TransactionAction.TransactionActionTypes.AddSendAsPermission: + RemoveADPermission(runspace, action.Account, action.Id, null, "Send-as", null); + break; + case TransactionAction.TransactionActionTypes.RemoveMailboxFullAccessPermission: + SetMailboxPermission(runspace, action.Account, action.Id, "FullAccess"); + break; + case TransactionAction.TransactionActionTypes.RemoveSendAsPermission: + SetExtendedRights(runspace, action.Account, action.Id, "Send-as"); + break; + } } #endregion } diff --git a/WebsitePanel/Sources/WebsitePanel.Providers.HostedSolution/Exchange2010.cs b/WebsitePanel/Sources/WebsitePanel.Providers.HostedSolution/Exchange2010.cs index 63c46ed2..fdb674cf 100644 --- a/WebsitePanel/Sources/WebsitePanel.Providers.HostedSolution/Exchange2010.cs +++ b/WebsitePanel/Sources/WebsitePanel.Providers.HostedSolution/Exchange2010.cs @@ -167,7 +167,7 @@ namespace WebsitePanel.Providers.HostedSolution return runspace; } - private static Assembly ResolveExchangeAssembly(object p, ResolveEventArgs args) + internal static Assembly ResolveExchangeAssembly(object p, ResolveEventArgs args) { //Add path for the Exchange 2007 DLLs if (args.Name.Contains("Microsoft.Exchange")) diff --git a/WebsitePanel/Sources/WebsitePanel.Providers.HostedSolution/Exchange2010SP2.cs b/WebsitePanel/Sources/WebsitePanel.Providers.HostedSolution/Exchange2010SP2.cs new file mode 100644 index 00000000..e2b16d4f --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.Providers.HostedSolution/Exchange2010SP2.cs @@ -0,0 +1,753 @@ +// Copyright (c) 2012, Outercurve Foundation. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// - Redistributions of source code must retain the above copyright notice, this +// list of conditions and the following disclaimer. +// +// - Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// - Neither the name of the Outercurve Foundation nor the names of its +// contributors may be used to endorse or promote products derived from this +// software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +using System; +using System.IO; +using System.Configuration; +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.Text; +using System.Reflection; +using System.Globalization; +using System.Collections; + +using System.DirectoryServices; +using System.Security; +using System.Security.Principal; +using System.Security.AccessControl; + +using System.Management.Automation; +using System.Management.Automation.Runspaces; + +using WebsitePanel.Providers; +using WebsitePanel.Providers.HostedSolution; +using WebsitePanel.Providers.Utils; +using WebsitePanel.Server.Utils; +using Microsoft.Exchange.Data.Directory.Recipient; +using Microsoft.Win32; + +using Microsoft.Exchange.Data; +using Microsoft.Exchange.Data.Directory; +using Microsoft.Exchange.Data.Storage; + +namespace WebsitePanel.Providers.HostedSolution +{ + public class Exchange2010SP2 : Exchange2010 + { + #region Static constructor + + static private Hashtable htBbalancer = new Hashtable(); + + static Exchange2010SP2() + { + AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(ResolveExchangeAssembly); + ExchangeRegistryPath = "SOFTWARE\\Microsoft\\ExchangeServer\\v14\\Setup"; + } + #endregion + + + #region Organization + /// + /// Creates organization on Mail Server + /// + /// + /// + internal override Organization ExtendToExchangeOrganizationInternal(string organizationId, string securityGroup, bool IsConsumer) + { + ExchangeLog.LogStart("CreateOrganizationInternal"); + ExchangeLog.DebugInfo(" Organization Id: {0}", organizationId); + + ExchangeTransaction transaction = StartTransaction(); + Organization info = new Organization(); + Runspace runSpace = null; + try + { + runSpace = OpenRunspace(); + + string server = GetServerName(); + string securityGroupPath = AddADPrefix(securityGroup); + + //Create mail enabled organization security group + EnableMailSecurityDistributionGroup(runSpace, securityGroup, organizationId); + transaction.RegisterMailEnabledDistributionGroup(securityGroup); + UpdateSecurityDistributionGroup(runSpace, securityGroup, organizationId, IsConsumer); + + //create GAL + string galId = CreateGlobalAddressList(runSpace, organizationId); + transaction.RegisterNewGlobalAddressList(galId); + ExchangeLog.LogInfo(" Global Address List: {0}", galId); + UpdateGlobalAddressList(runSpace, galId, securityGroupPath); + + //create AL + string alId = CreateAddressList(runSpace, organizationId); + transaction.RegisterNewAddressList(alId); + ExchangeLog.LogInfo(" Address List: {0}", alId); + UpdateAddressList(runSpace, alId, securityGroupPath); + + //create RAL + string ralId = CreateRoomsAddressList(runSpace, organizationId); + transaction.RegisterNewRoomsAddressList(ralId); + ExchangeLog.LogInfo(" Rooms Address List: {0}", ralId); + UpdateAddressList(runSpace, ralId, securityGroupPath); + + //create ActiveSync policy + string asId = CreateActiveSyncPolicy(runSpace, organizationId); + transaction.RegisterNewActiveSyncPolicy(asId); + ExchangeLog.LogInfo(" ActiveSync Policy: {0}", asId); + + info.AddressList = alId; + info.GlobalAddressList = galId; + info.RoomsAddressList = ralId; + info.OrganizationId = organizationId; + } + catch (Exception ex) + { + ExchangeLog.LogError("CreateOrganizationInternal", ex); + RollbackTransaction(transaction); + throw; + } + finally + { + + CloseRunspace(runSpace); + } + ExchangeLog.LogEnd("CreateOrganizationInternal"); + return info; + } + + + internal override Organization CreateOrganizationAddressBookPolicyInternal(string organizationId, string gal, string addressBook, string roomList, string oab) + { + ExchangeLog.LogStart("CreateOrganizationAddressBookPolicyInternal"); + ExchangeLog.LogInfo(" Organization Id: {0}", organizationId); + ExchangeLog.LogInfo(" GAL: {0}", gal); + ExchangeLog.LogInfo(" AddressBook: {0}", addressBook); + ExchangeLog.LogInfo(" RoomList: {0}", roomList); + ExchangeLog.LogInfo(" OAB: {0}", oab); + + ExchangeTransaction transaction = StartTransaction(); + + Organization info = new Organization(); + string policyName = GetAddressBookPolicyName(organizationId); + + Runspace runSpace = null; + try + { + runSpace = OpenRunspace(); + Command cmd = new Command("New-AddressBookPolicy"); + cmd.Parameters.Add("Name", policyName); + cmd.Parameters.Add("AddressLists", addressBook); + cmd.Parameters.Add("RoomList", roomList); + cmd.Parameters.Add("GlobalAddressList", gal); + cmd.Parameters.Add("OfflineAddressBook", oab); + + Collection result = ExecuteShellCommand(runSpace, cmd); + info.AddressBookPolicy = GetResultObjectDN(result); + + } + catch (Exception ex) + { + ExchangeLog.LogError("CreateOrganizationAddressBookPolicyInternal", ex); + RollbackTransaction(transaction); + throw; + } + finally + { + + CloseRunspace(runSpace); + } + ExchangeLog.LogEnd("CreateOrganizationAddressBookPolicyInternal"); + return info; + } + + internal override bool DeleteOrganizationInternal(string organizationId, string distinguishedName, + string globalAddressList, string addressList, string roomList, string offlineAddressBook, string securityGroup, string addressBookPolicy) + { + ExchangeLog.LogStart("DeleteOrganizationInternal"); + bool ret = true; + + Runspace runSpace = null; + try + { + runSpace = OpenRunspace(); + + + string ou = ConvertADPathToCanonicalName(distinguishedName); + + if (!DeleteOrganizationMailboxes(runSpace, ou)) + ret = false; + + if (!DeleteOrganizationContacts(runSpace, ou)) + ret = false; + + if (!DeleteOrganizationDistributionLists(runSpace, ou)) + ret = false; + + //delete AddressBookPolicy + try + { + if (!string.IsNullOrEmpty(addressBookPolicy)) + DeleteAddressBookPolicy(runSpace, addressBookPolicy); + } + catch (Exception ex) + { + ret = false; + ExchangeLog.LogError("Could not delete AddressBook Policy " + addressBookPolicy, ex); + } + + //delete OAB + try + { + if (!string.IsNullOrEmpty(offlineAddressBook)) + DeleteOfflineAddressBook(runSpace, offlineAddressBook); + } + catch (Exception ex) + { + ret = false; + ExchangeLog.LogError("Could not delete Offline Address Book " + offlineAddressBook, ex); + } + + //delete AL + try + { + if (!string.IsNullOrEmpty(addressList)) + DeleteAddressList(runSpace, addressList); + } + catch (Exception ex) + { + ret = false; + ExchangeLog.LogError("Could not delete Address List " + addressList, ex); + } + + //delete RL + try + { + if (!string.IsNullOrEmpty(roomList)) + DeleteAddressList(runSpace, roomList); + } + catch (Exception ex) + { + ret = false; + ExchangeLog.LogError("Could not delete Address List " + roomList, ex); + } + + + //delete GAL + try + { + if (!string.IsNullOrEmpty(globalAddressList)) + DeleteGlobalAddressList(runSpace, globalAddressList); + } + catch (Exception ex) + { + ret = false; + ExchangeLog.LogError("Could not delete Global Address List " + globalAddressList, ex); + } + + //delete ActiveSync policy + try + { + DeleteActiveSyncPolicy(runSpace, organizationId); + } + catch (Exception ex) + { + ret = false; + ExchangeLog.LogError("Could not delete ActiveSyncPolicy " + organizationId, ex); + } + + //disable mail security distribution group + try + { + DisableMailSecurityDistributionGroup(runSpace, securityGroup); + } + catch (Exception ex) + { + ret = false; + ExchangeLog.LogError("Could not disable mail security distribution group " + securityGroup, ex); + } + } + catch (Exception ex) + { + ret = false; + ExchangeLog.LogError("DeleteOrganizationInternal", ex); + throw; + } + finally + { + + CloseRunspace(runSpace); + } + ExchangeLog.LogEnd("DeleteOrganizationInternal"); + return ret; + } + + internal override void DeleteAddressBookPolicy(Runspace runSpace, string id) + { + ExchangeLog.LogStart("DeleteAddressBookPolicy"); + //if (id != "IsConsumer") + //{ + Command cmd = new Command("Remove-AddressBookPolicy"); + cmd.Parameters.Add("Identity", id); + cmd.Parameters.Add("Confirm", false); + ExecuteShellCommand(runSpace, cmd); + //} + ExchangeLog.LogEnd("DeleteAddressBookPolicy"); + } + + #endregion + + #region Mailbox + internal override string CreateMailEnableUserInternal(string upn, string organizationId, string organizationDistinguishedName, ExchangeAccountType accountType, + string mailboxDatabase, string offlineAddressBook, string addressBookPolicy, + string accountName, bool enablePOP, bool enableIMAP, + bool enableOWA, bool enableMAPI, bool enableActiveSync, + int issueWarningKB, int prohibitSendKB, int prohibitSendReceiveKB, int keepDeletedItemsDays, + int maxRecipients, int maxSendMessageSizeKB, int maxReceiveMessageSizeKB, bool hideFromAddressBook, bool IsConsumer) + { + + ExchangeLog.LogStart("CreateMailEnableUserInternal"); + ExchangeLog.DebugInfo("Organization Id: {0}", organizationId); + + string ret = null; + ExchangeTransaction transaction = StartTransaction(); + Runspace runSpace = null; + + int attempts = 0; + string id = null; + + try + { + runSpace = OpenRunspace(); + Command cmd = null; + Collection result = null; + + //try to enable mail user for 10 times + while (true) + { + try + { + //create mailbox + cmd = new Command("Enable-Mailbox"); + cmd.Parameters.Add("Identity", upn); + cmd.Parameters.Add("Alias", accountName); + string database = GetDatabase(runSpace, PrimaryDomainController, mailboxDatabase); + ExchangeLog.DebugInfo("database: " + database); + if (database != string.Empty) + { + cmd.Parameters.Add("Database", database); + } + if (accountType == ExchangeAccountType.Equipment) + cmd.Parameters.Add("Equipment"); + else if (accountType == ExchangeAccountType.Room) + cmd.Parameters.Add("Room"); + + result = ExecuteShellCommand(runSpace, cmd); + + id = CheckResultObjectDN(result); + } + catch (Exception ex) + { + ExchangeLog.LogError(ex); + } + if (id != null) + break; + + if (attempts > 9) + throw new Exception( + string.Format("Could not enable mail user '{0}' ", upn)); + + attempts++; + ExchangeLog.LogWarning("Attempt #{0} to enable mail user failed!", attempts); + // wait 5 sec + System.Threading.Thread.Sleep(1000); + } + + transaction.RegisterEnableMailbox(id); + + string windowsEmailAddress = ObjToString(GetPSObjectProperty(result[0], "WindowsEmailAddress")); + + //update mailbox + cmd = new Command("Set-Mailbox"); + cmd.Parameters.Add("Identity", id); + cmd.Parameters.Add("OfflineAddressBook", offlineAddressBook); + cmd.Parameters.Add("EmailAddressPolicyEnabled", false); + cmd.Parameters.Add("CustomAttribute1", organizationId); + cmd.Parameters.Add("CustomAttribute3", windowsEmailAddress); + cmd.Parameters.Add("PrimarySmtpAddress", upn); + cmd.Parameters.Add("WindowsEmailAddress", upn); + + cmd.Parameters.Add("UseDatabaseQuotaDefaults", new bool?(false)); + cmd.Parameters.Add("UseDatabaseRetentionDefaults", false); + cmd.Parameters.Add("IssueWarningQuota", ConvertKBToUnlimited(issueWarningKB)); + cmd.Parameters.Add("ProhibitSendQuota", ConvertKBToUnlimited(prohibitSendKB)); + cmd.Parameters.Add("ProhibitSendReceiveQuota", ConvertKBToUnlimited(prohibitSendReceiveKB)); + cmd.Parameters.Add("RetainDeletedItemsFor", ConvertDaysToEnhancedTimeSpan(keepDeletedItemsDays)); + cmd.Parameters.Add("RecipientLimits", ConvertInt32ToUnlimited(maxRecipients)); + cmd.Parameters.Add("MaxSendSize", ConvertKBToUnlimited(maxSendMessageSizeKB)); + cmd.Parameters.Add("MaxReceiveSize", ConvertKBToUnlimited(maxReceiveMessageSizeKB)); + if (IsConsumer) cmd.Parameters.Add("HiddenFromAddressListsEnabled", true); + else + cmd.Parameters.Add("HiddenFromAddressListsEnabled", hideFromAddressBook); + cmd.Parameters.Add("AddressBookPolicy", addressBookPolicy); + ExecuteShellCommand(runSpace, cmd); + + //Client Access + cmd = new Command("Set-CASMailbox"); + cmd.Parameters.Add("Identity", id); + cmd.Parameters.Add("ActiveSyncEnabled", enableActiveSync); + if (enableActiveSync) + { + cmd.Parameters.Add("ActiveSyncMailboxPolicy", organizationId); + } + cmd.Parameters.Add("OWAEnabled", enableOWA); + cmd.Parameters.Add("MAPIEnabled", enableMAPI); + cmd.Parameters.Add("PopEnabled", enablePOP); + cmd.Parameters.Add("ImapEnabled", enableIMAP); + ExecuteShellCommand(runSpace, cmd); + + //add to the security group + cmd = new Command("Add-DistributionGroupMember"); + cmd.Parameters.Add("Identity", organizationId); + cmd.Parameters.Add("Member", id); + cmd.Parameters.Add("BypassSecurityGroupManagerCheck", true); + ExecuteShellCommand(runSpace, cmd); + + if (!IsConsumer) + { + //Set-MailboxFolderPermission for calendar + cmd = new Command("Add-MailboxFolderPermission"); + cmd.Parameters.Add("Identity", id + ":\\calendar"); + cmd.Parameters.Add("AccessRights", "Reviewer"); + cmd.Parameters.Add("User", organizationId); + ExecuteShellCommand(runSpace, cmd); + } + cmd = new Command("Set-MailboxFolderPermission"); + cmd.Parameters.Add("Identity", id + ":\\calendar"); + cmd.Parameters.Add("AccessRights", "None"); + cmd.Parameters.Add("User", "Default"); + ExecuteShellCommand(runSpace, cmd); + + ret = string.Format("{0}\\{1}", GetNETBIOSDomainName(), accountName); + ExchangeLog.LogEnd("CreateMailEnableUserInternal"); + return ret; + } + catch (Exception ex) + { + ExchangeLog.LogError("CreateMailEnableUserInternal", ex); + RollbackTransaction(transaction); + throw; + } + finally + { + CloseRunspace(runSpace); + } + } + + + internal override void DisableMailboxInternal(string id) + { + ExchangeLog.LogStart("DisableMailboxInternal"); + Runspace runSpace = null; + try + { + runSpace = OpenRunspace(); + + Command cmd = new Command("Get-Mailbox"); + cmd.Parameters.Add("Identity", id); + Collection result = ExecuteShellCommand(runSpace, cmd); + + if (result != null && result.Count > 0) + { + string upn = ObjToString(GetPSObjectProperty(result[0], "UserPrincipalName")); + + string addressbookPolicy = ObjToString(GetPSObjectProperty(result[0], "AddressBookPolicy")); + + cmd = new Command("Disable-Mailbox"); + cmd.Parameters.Add("Identity", id); + cmd.Parameters.Add("Confirm", false); + ExecuteShellCommand(runSpace, cmd); + + if (addressbookPolicy == (upn + " AP")) + { + try + { + DeleteAddressBookPolicy(runSpace, upn + " AP"); + } + catch (Exception) + { + } + + try + { + DeleteGlobalAddressList(runSpace, upn + " GAL"); + } + catch (Exception) + { + } + + try + { + DeleteAddressList(runSpace, upn + " AL"); + } + catch (Exception) + { + } + } + + + } + + } + + finally + { + + CloseRunspace(runSpace); + } + ExchangeLog.LogEnd("DisableMailboxInternal"); + } + + + internal override void DeleteMailboxInternal(string accountName) + { + ExchangeLog.LogStart("DeleteMailboxInternal"); + ExchangeLog.DebugInfo("Account Name: {0}", accountName); + + Runspace runSpace = null; + try + { + runSpace = OpenRunspace(); + + Command cmd = new Command("Get-Mailbox"); + cmd.Parameters.Add("Identity", accountName); + Collection result = ExecuteShellCommand(runSpace, cmd); + + if (result != null && result.Count > 0) + { + string upn = ObjToString(GetPSObjectProperty(result[0], "UserPrincipalName")); + string addressbookPolicy = ObjToString(GetPSObjectProperty(result[0], "AddressBookPolicy")); + + RemoveMailbox(runSpace, accountName); + + if (addressbookPolicy == (upn + " AP")) + { + try + { + DeleteAddressBookPolicy(runSpace, upn + " AP"); + } + catch (Exception) + { + } + + try + { + DeleteGlobalAddressList(runSpace, upn + " GAL"); + } + catch (Exception) + { + } + + try + { + DeleteAddressList(runSpace, upn + " AL"); + } + catch (Exception) + { + } + } + } + + + } + finally + { + + CloseRunspace(runSpace); + } + ExchangeLog.LogEnd("DeleteMailboxInternal"); + } + + + internal string GetDatabase(Runspace runSpace, string primaryDomainController, string dagName) + { + string database = string.Empty; + + if (string.IsNullOrEmpty(dagName)) return string.Empty; + + ExchangeLog.LogStart("GetDatabase"); + ExchangeLog.LogInfo("DAG: " + dagName); + + //Get Dag Servers + Collection dags = null; + Command cmd = new Command("Get-DatabaseAvailabilityGroup"); + cmd.Parameters.Add("Identity", dagName); + dags = ExecuteShellCommand(runSpace, cmd); + + if (htBbalancer == null) + htBbalancer = new Hashtable(); + + if (htBbalancer[dagName] == null) + htBbalancer.Add(dagName, 0); + + if (dags != null && dags.Count > 0) + { + + ADMultiValuedProperty servers = (ADMultiValuedProperty)GetPSObjectProperty(dags[0], "Servers"); + + if (servers != null) + { + System.Collections.Generic.List lstDatabase = new System.Collections.Generic.List(); + + foreach (object objServer in servers) + { + Collection databases = null; + cmd = new Command("Get-MailboxDatabase"); + cmd.Parameters.Add("Server", ObjToString(objServer)); + databases = ExecuteShellCommand(runSpace, cmd); + + foreach (PSObject objDatabase in databases) + { + if (((bool)GetPSObjectProperty(objDatabase, "IsExcludedFromProvisioning") == false) && + ((bool)GetPSObjectProperty(objDatabase, "IsSuspendedFromProvisioning") == false)) + { + string db = ObjToString(GetPSObjectProperty(objDatabase, "Identity")); + + bool bAdd = true; + foreach (string s in lstDatabase) + { + if (s.ToLower() == db.ToLower()) + { + bAdd = false; + break; + } + } + + if (bAdd) + { + lstDatabase.Add(db); + ExchangeLog.LogInfo("AddDatabase: " + db); + } + } + } + } + + int balancer = (int)htBbalancer[dagName]; + balancer++; + if (balancer >= lstDatabase.Count) balancer = 0; + htBbalancer[dagName] = balancer; + if (lstDatabase.Count != 0) database = lstDatabase[balancer]; + + } + } + + ExchangeLog.LogEnd("GetDatabase"); + return database; + } + + + #endregion + + #region AddressBook + internal override void AdjustADSecurity(string objPath, string securityGroupPath, bool isAddressBook) + { + ExchangeLog.LogStart("AdjustADSecurity"); + ExchangeLog.DebugInfo(" Active Direcory object: {0}", objPath); + ExchangeLog.DebugInfo(" Security Group: {0}", securityGroupPath); + + if (isAddressBook) + { + ExchangeLog.DebugInfo(" Updating Security"); + //"Download Address Book" security permission for offline address book + Guid openAddressBookGuid = new Guid("{bd919c7c-2d79-4950-bc9c-e16fd99285e8}"); + + DirectoryEntry groupEntry = GetADObject(securityGroupPath); + byte[] byteSid = (byte[])GetADObjectProperty(groupEntry, "objectSid"); + + DirectoryEntry objEntry = GetADObject(objPath); + ActiveDirectorySecurity security = objEntry.ObjectSecurity; + + // Create a SecurityIdentifier object for security group. + SecurityIdentifier groupSid = new SecurityIdentifier(byteSid, 0); + + // Create an access rule to allow users in Security Group to open address book. + ActiveDirectoryAccessRule allowOpenAddressBook = + new ActiveDirectoryAccessRule( + groupSid, + ActiveDirectoryRights.ExtendedRight, + AccessControlType.Allow, + openAddressBookGuid); + + // Create an access rule to allow users in Security Group to read object. + ActiveDirectoryAccessRule allowRead = + new ActiveDirectoryAccessRule( + groupSid, + ActiveDirectoryRights.GenericRead, + AccessControlType.Allow); + + // Remove existing rules if exist + security.RemoveAccessRuleSpecific(allowOpenAddressBook); + security.RemoveAccessRuleSpecific(allowRead); + + // Add a new access rule to allow users in Security Group to open address book. + security.AddAccessRule(allowOpenAddressBook); + // Add a new access rule to allow users in Security Group to read object. + security.AddAccessRule(allowRead); + + // Commit the changes. + objEntry.CommitChanges(); + } + + ExchangeLog.LogEnd("AdjustADSecurity"); + } + + + #endregion + + + + public override bool IsInstalled() + { + int value = 0; + bool bResult = false; + RegistryKey root = Registry.LocalMachine; + RegistryKey rk = root.OpenSubKey(ExchangeRegistryPath); + if (rk != null) + { + value = (int)rk.GetValue("MsiProductMajor", null); + if (value == 14) + { + value = (int)rk.GetValue("MsiProductMinor", null); + if (value == 2) bResult = true; + } + rk.Close(); + } + return bResult; + } + } +} + diff --git a/WebsitePanel/Sources/WebsitePanel.Providers.HostedSolution/ExchangeLog.cs b/WebsitePanel/Sources/WebsitePanel.Providers.HostedSolution/ExchangeLog.cs index 5472863c..aa965e8f 100644 --- a/WebsitePanel/Sources/WebsitePanel.Providers.HostedSolution/ExchangeLog.cs +++ b/WebsitePanel/Sources/WebsitePanel.Providers.HostedSolution/ExchangeLog.cs @@ -33,71 +33,67 @@ using WebsitePanel.Server.Utils; namespace WebsitePanel.Providers.HostedSolution { - /// - /// Exchange Log Helper Methods - /// - internal class ExchangeLog - { - internal static string LogPrefix = "Exchange"; + /// + /// Exchange Log Helper Methods + /// + internal class ExchangeLog + { + internal static string LogPrefix = "Exchange"; - internal static void LogStart(string message, params object[] args) - { - string text = String.Format(message, args); - Log.WriteStart("{0} {1}", LogPrefix, text); - } + internal static void LogStart(string message, params object[] args) + { + string text = String.Format(message, args); + Log.WriteStart("{0} {1}", LogPrefix, text); + } - internal static void LogEnd(string message, params object[] args) - { - string text = String.Format(message, args); - Log.WriteEnd("{0} {1}", LogPrefix, text); - } + internal static void LogEnd(string message, params object[] args) + { + string text = String.Format(message, args); + Log.WriteEnd("{0} {1}", LogPrefix, text); + } - internal static void LogInfo(string message, params object[] args) - { - string text = String.Format(message, args); - Log.WriteInfo("{0} {1}", LogPrefix, text); - } + internal static void LogInfo(string message, params object[] args) + { + string text = String.Format(message, args); + Log.WriteInfo("{0} {1}", LogPrefix, text); + } - internal static void LogWarning(string message, params object[] args) - { - string text = String.Format(message, args); - Log.WriteWarning("{0} {1}", LogPrefix, text); - } + internal static void LogWarning(string message, params object[] args) + { + string text = String.Format(message, args); + Log.WriteWarning("{0} {1}", LogPrefix, text); + } - internal static void LogError(Exception ex) - { - Log.WriteError(LogPrefix, ex); - } + internal static void LogError(Exception ex) + { + Log.WriteError(LogPrefix, ex); + } - internal static void LogError(string message, Exception ex) - { - string text = String.Format("{0} {1}", LogPrefix, message); - Log.WriteError(text, ex); - } + internal static void LogError(string message, Exception ex) + { + string text = String.Format("{0} {1}", LogPrefix, message); + Log.WriteError(text, ex); + } - internal static void DebugInfo(string message, params object[] args) - { -#if DEBUG - string text = String.Format(message, args); - Log.WriteInfo("{0} {1}", LogPrefix, text); -#endif - } + internal static void DebugInfo(string message, params object[] args) + { + string text = String.Format(message, args); + Log.WriteInfo("{0} {1}", LogPrefix, text); + } - internal static void DebugCommand(Command cmd) - { -#if DEBUG - StringBuilder sb = new StringBuilder(cmd.CommandText); - foreach (CommandParameter parameter in cmd.Parameters) - { - string formatString = " -{0} {1}"; - if (parameter.Value is string) - formatString = " -{0} '{1}'"; - else if (parameter.Value is bool) - formatString = " -{0} ${1}"; - sb.AppendFormat(formatString, parameter.Name, parameter.Value); - } - Log.WriteInfo("{0} {1}", LogPrefix, sb.ToString()); -#endif - } - } + internal static void DebugCommand(Command cmd) + { + StringBuilder sb = new StringBuilder(cmd.CommandText); + foreach (CommandParameter parameter in cmd.Parameters) + { + string formatString = " -{0} {1}"; + if (parameter.Value is string) + formatString = " -{0} '{1}'"; + else if (parameter.Value is bool) + formatString = " -{0} ${1}"; + sb.AppendFormat(formatString, parameter.Name, parameter.Value); + } + Log.WriteInfo("{0} {1}", LogPrefix, sb.ToString()); + } + } } diff --git a/WebsitePanel/Sources/WebsitePanel.Providers.HostedSolution/ExchangeTransaction.cs b/WebsitePanel/Sources/WebsitePanel.Providers.HostedSolution/ExchangeTransaction.cs index 0af4bb65..1d6e0eba 100644 --- a/WebsitePanel/Sources/WebsitePanel.Providers.HostedSolution/ExchangeTransaction.cs +++ b/WebsitePanel/Sources/WebsitePanel.Providers.HostedSolution/ExchangeTransaction.cs @@ -30,228 +30,180 @@ using System.Collections.Generic; namespace WebsitePanel.Providers.HostedSolution { - internal class ExchangeTransaction - { - List actions = null; + internal class ExchangeTransaction + { + List actions = null; - public ExchangeTransaction() - { - actions = new List(); - } + public ExchangeTransaction() + { + actions = new List(); + } - internal List Actions - { - get { return actions; } - } + internal List Actions + { + get { return actions; } + } - internal void RegisterNewOrganizationUnit(string id) - { - TransactionAction action = new TransactionAction(); - action.ActionType = TransactionAction.TransactionActionTypes.CreateOrganizationUnit; - action.Id = id; - Actions.Add(action); - } + internal void RegisterNewOrganizationUnit(string id) + { + TransactionAction action = new TransactionAction(); + action.ActionType = TransactionAction.TransactionActionTypes.CreateOrganizationUnit; + action.Id = id; + Actions.Add(action); + } - public void RegisterNewDistributionGroup(string id) - { - TransactionAction action = new TransactionAction(); - action.ActionType = TransactionAction.TransactionActionTypes.CreateDistributionGroup; - action.Id = id; - Actions.Add(action); - } + public void RegisterNewDistributionGroup(string id) + { + TransactionAction action = new TransactionAction(); + action.ActionType = TransactionAction.TransactionActionTypes.CreateDistributionGroup; + action.Id = id; + Actions.Add(action); + } - public void RegisterMailEnabledDistributionGroup(string id) - { - TransactionAction action = new TransactionAction(); - action.ActionType = TransactionAction.TransactionActionTypes.EnableDistributionGroup; - action.Id = id; - Actions.Add(action); - } + public void RegisterMailEnabledDistributionGroup(string id) + { + TransactionAction action = new TransactionAction(); + action.ActionType = TransactionAction.TransactionActionTypes.EnableDistributionGroup; + action.Id = id; + Actions.Add(action); + } + + internal void RegisterNewGlobalAddressList(string id) + { + TransactionAction action = new TransactionAction(); + action.ActionType = TransactionAction.TransactionActionTypes.CreateGlobalAddressList; + action.Id = id; + Actions.Add(action); + } + + internal void RegisterNewAddressList(string id) + { + TransactionAction action = new TransactionAction(); + action.ActionType = TransactionAction.TransactionActionTypes.CreateAddressList; + action.Id = id; + Actions.Add(action); + } + + internal void RegisterNewAddressBookPolicy(string id) + { + TransactionAction action = new TransactionAction(); + action.ActionType = TransactionAction.TransactionActionTypes.CreateAddressBookPolicy; + action.Id = id; + Actions.Add(action); + } - internal void RegisterNewGlobalAddressList(string id) - { - TransactionAction action = new TransactionAction(); - action.ActionType = TransactionAction.TransactionActionTypes.CreateGlobalAddressList; - action.Id = id; - Actions.Add(action); - } - internal void RegisterNewAddressList(string id) - { - TransactionAction action = new TransactionAction(); - action.ActionType = TransactionAction.TransactionActionTypes.CreateAddressList; - action.Id = id; - Actions.Add(action); - } internal void RegisterNewRoomsAddressList(string id) { TransactionAction action = new TransactionAction(); - action.ActionType = TransactionAction.TransactionActionTypes.CreateRoomsAddressList; + action.ActionType = TransactionAction.TransactionActionTypes.CreateAddressList; action.Id = id; Actions.Add(action); } - internal void RegisterNewAddressPolicy(string id) + + + internal void RegisterNewOfflineAddressBook(string id) { TransactionAction action = new TransactionAction(); - action.ActionType = TransactionAction.TransactionActionTypes.CreateAddressPolicy; + action.ActionType = TransactionAction.TransactionActionTypes.CreateOfflineAddressBook; + action.Id = id; + Actions.Add(action); + } + + internal void RegisterNewActiveSyncPolicy(string id) + { + TransactionAction action = new TransactionAction(); + action.ActionType = TransactionAction.TransactionActionTypes.CreateActiveSyncPolicy; action.Id = id; Actions.Add(action); } - internal void RegisterNewOfflineAddressBook(string id) - { - TransactionAction action = new TransactionAction(); - action.ActionType = TransactionAction.TransactionActionTypes.CreateOfflineAddressBook; - action.Id = id; - Actions.Add(action); - } + internal void RegisterNewAcceptedDomain(string id) + { + TransactionAction action = new TransactionAction(); + action.ActionType = TransactionAction.TransactionActionTypes.CreateAcceptedDomain; + action.Id = id; + Actions.Add(action); + } - internal void RegisterNewActiveSyncPolicy(string id) - { - TransactionAction action = new TransactionAction(); - action.ActionType = TransactionAction.TransactionActionTypes.CreateActiveSyncPolicy; - action.Id = id; - Actions.Add(action); - } + internal void RegisterNewUPNSuffix(string id, string suffix) + { + TransactionAction action = new TransactionAction(); + action.ActionType = TransactionAction.TransactionActionTypes.AddUPNSuffix; + action.Id = id; + action.Suffix = suffix; + Actions.Add(action); + } + + internal void RegisterNewMailbox(string id) + { + TransactionAction action = new TransactionAction(); + action.ActionType = TransactionAction.TransactionActionTypes.CreateMailbox; + action.Id = id; + Actions.Add(action); + } + + internal void RegisterEnableMailbox(string id) + { + TransactionAction action = new TransactionAction(); + action.ActionType = TransactionAction.TransactionActionTypes.EnableMailbox; + action.Id = id; + Actions.Add(action); + } - internal void RegisterNewAcceptedDomain(string id) - { - TransactionAction action = new TransactionAction(); - action.ActionType = TransactionAction.TransactionActionTypes.CreateAcceptedDomain; - action.Id = id; - Actions.Add(action); - } + internal void RegisterNewContact(string id) + { + TransactionAction action = new TransactionAction(); + action.ActionType = TransactionAction.TransactionActionTypes.CreateContact; + action.Id = id; + Actions.Add(action); + } - internal void RegisterNewUPNSuffix(string id, string suffix) - { - TransactionAction action = new TransactionAction(); - action.ActionType = TransactionAction.TransactionActionTypes.AddUPNSuffix; - action.Id = id; - action.Suffix = suffix; - Actions.Add(action); - } + internal void RegisterNewPublicFolder(string id) + { + TransactionAction action = new TransactionAction(); + action.ActionType = TransactionAction.TransactionActionTypes.CreatePublicFolder; + action.Id = id; + Actions.Add(action); + } - internal void RegisterNewMailbox(string id) - { - TransactionAction action = new TransactionAction(); - action.ActionType = TransactionAction.TransactionActionTypes.CreateMailbox; - action.Id = id; - Actions.Add(action); - } + internal void AddMailBoxFullAccessPermission(string accountName, string id) + { + TransactionAction action = new TransactionAction(); + action.ActionType = TransactionAction.TransactionActionTypes.AddMailboxFullAccessPermission; + action.Id = id; + action.Account = accountName; + Actions.Add(action); + } - internal void RegisterNewContact(string id) - { - TransactionAction action = new TransactionAction(); - action.ActionType = TransactionAction.TransactionActionTypes.CreateContact; - action.Id = id; - Actions.Add(action); - } - - internal void RegisterNewPublicFolder(string id) - { - TransactionAction action = new TransactionAction(); - action.ActionType = TransactionAction.TransactionActionTypes.CreatePublicFolder; - action.Id = id; - Actions.Add(action); - } - - internal void AddMailBoxFullAccessPermission(string accountName, string id) - { - TransactionAction action = new TransactionAction(); - action.ActionType = TransactionAction.TransactionActionTypes.AddMailboxFullAccessPermission; - action.Id = id; - action.Account = accountName; - Actions.Add(action); - } - - internal void AddSendAsPermission(string accountName, string id) - { - TransactionAction action = new TransactionAction(); - action.ActionType = TransactionAction.TransactionActionTypes.AddSendAsPermission; - action.Id = id; - action.Account = accountName; - Actions.Add(action); - } - - internal void RemoveMailboxFullAccessPermission(string accountName, string id) - { - TransactionAction action = new TransactionAction(); - action.ActionType = TransactionAction.TransactionActionTypes.RemoveMailboxFullAccessPermission; - action.Id = id; - action.Account = accountName; - Actions.Add(action); - } - - internal void RemoveSendAsPermission(string accountName, string id) - { - TransactionAction action = new TransactionAction(); - action.ActionType = TransactionAction.TransactionActionTypes.RemoveSendAsPermission; - action.Id = id; - action.Account = accountName; - Actions.Add(action); - } - } - - internal class TransactionAction - { - private TransactionActionTypes actionType; - - public TransactionActionTypes ActionType - { - get { return actionType; } - set { actionType = value; } - } - - private string id; - - public string Id - { - get { return id; } - set { id = value; } - } - - private string suffix; - - public string Suffix - { - get { return suffix; } - set { suffix = value; } - } - - private string account; - - public string Account - { - get { return account; } - set { account = value; } - - } - - internal enum TransactionActionTypes - { - CreateOrganizationUnit, - CreateGlobalAddressList, - CreateAddressList, - CreateAddressPolicy, - CreateOfflineAddressBook, - CreateDistributionGroup, - EnableDistributionGroup, - CreateAcceptedDomain, - AddUPNSuffix, - CreateMailbox, - CreateContact, - CreatePublicFolder, - CreateActiveSyncPolicy, - AddMailboxFullAccessPermission, - AddSendAsPermission, - RemoveMailboxFullAccessPermission, - RemoveSendAsPermission, - CreateRoomsAddressList - }; - } + internal void AddSendAsPermission(string accountName, string id) + { + TransactionAction action = new TransactionAction(); + action.ActionType = TransactionAction.TransactionActionTypes.AddSendAsPermission; + action.Id = id; + action.Account = accountName; + Actions.Add(action); + } + internal void RemoveMailboxFullAccessPermission(string accountName, string id) + { + TransactionAction action = new TransactionAction(); + action.ActionType = TransactionAction.TransactionActionTypes.RemoveMailboxFullAccessPermission; + action.Id = id; + action.Account = accountName; + Actions.Add(action); + } + internal void RemoveSendAsPermission(string accountName, string id) + { + TransactionAction action = new TransactionAction(); + action.ActionType = TransactionAction.TransactionActionTypes.RemoveSendAsPermission; + action.Id = id; + action.Account = accountName; + Actions.Add(action); + } + } } diff --git a/WebsitePanel/Sources/WebsitePanel.Providers.HostedSolution/OrganizationProvider.cs b/WebsitePanel/Sources/WebsitePanel.Providers.HostedSolution/OrganizationProvider.cs index 6e3a9e9c..9b78cd77 100644 --- a/WebsitePanel/Sources/WebsitePanel.Providers.HostedSolution/OrganizationProvider.cs +++ b/WebsitePanel/Sources/WebsitePanel.Providers.HostedSolution/OrganizationProvider.cs @@ -342,9 +342,9 @@ namespace WebsitePanel.Providers.HostedSolution #region Users - public void CreateUser(string organizationId, string loginName, string displayName, string upn, string password, bool enabled) + public int CreateUser(string organizationId, string loginName, string displayName, string upn, string password, bool enabled) { - CreateUserInternal(organizationId, loginName, displayName, upn, password, enabled); + return CreateUserInternal(organizationId, loginName, displayName, upn, password, enabled); } internal int CreateUserInternal(string organizationId, string loginName, string displayName, string upn, string password, bool enabled) @@ -356,36 +356,43 @@ namespace WebsitePanel.Providers.HostedSolution if (string.IsNullOrEmpty(organizationId)) throw new ArgumentNullException("organizationId"); - + if (string.IsNullOrEmpty(loginName)) throw new ArgumentNullException("loginName"); if (string.IsNullOrEmpty(password)) throw new ArgumentNullException("password"); - bool userCreated = false; + bool userCreated = false; string userPath = null; try { string path = GetOrganizationPath(organizationId); - userPath= GetUserPath(organizationId, loginName); + userPath = GetUserPath(organizationId, loginName); if (!ActiveDirectoryUtils.AdObjectExists(userPath)) { - userPath = ActiveDirectoryUtils.CreateUser(path, loginName, displayName, password, enabled); + userPath = ActiveDirectoryUtils.CreateUser(path, upn, loginName, displayName, password, enabled); DirectoryEntry entry = new DirectoryEntry(userPath); ActiveDirectoryUtils.SetADObjectProperty(entry, ADAttributes.UserPrincipalName, upn); entry.CommitChanges(); userCreated = true; + HostedSolutionLog.DebugInfo("User created: {0}", displayName); } else + { + HostedSolutionLog.DebugInfo("AD_OBJECT_ALREADY_EXISTS: {0}", userPath); + HostedSolutionLog.LogEnd("CreateUserInternal"); return Errors.AD_OBJECT_ALREADY_EXISTS; - - string groupPath = GetGroupPath(organizationId); + } + + string groupPath = GetGroupPath(organizationId); + HostedSolutionLog.DebugInfo("Group retrieved: {0}", groupPath); + - ActiveDirectoryUtils.AddUserToGroup(userPath, groupPath); + HostedSolutionLog.DebugInfo("Added to group: {0}", groupPath); } - catch(Exception e) + catch (Exception e) { HostedSolutionLog.LogError(e); try @@ -393,10 +400,12 @@ namespace WebsitePanel.Providers.HostedSolution if (userCreated) ActiveDirectoryUtils.DeleteADObject(userPath); } - catch(Exception ex) + catch (Exception ex) { HostedSolutionLog.LogError(ex); - } + } + + return Errors.AD_OBJECT_ALREADY_EXISTS; } HostedSolutionLog.LogEnd("CreateUserInternal"); @@ -492,10 +501,10 @@ namespace WebsitePanel.Providers.HostedSolution DirectoryEntry entry = ActiveDirectoryUtils.GetADObject(path); OrganizationUser retUser = new OrganizationUser(); - + retUser.FirstName = ActiveDirectoryUtils.GetADObjectStringProperty(entry, ADAttributes.FirstName); retUser.LastName = ActiveDirectoryUtils.GetADObjectStringProperty(entry, ADAttributes.LastName); - retUser.DisplayName = ActiveDirectoryUtils.GetADObjectStringProperty(entry, ADAttributes.DisplayName); + retUser.DisplayName = ActiveDirectoryUtils.GetADObjectStringProperty(entry, ADAttributes.DisplayName); retUser.Initials = ActiveDirectoryUtils.GetADObjectStringProperty(entry, ADAttributes.Initials); retUser.JobTitle = ActiveDirectoryUtils.GetADObjectStringProperty(entry, ADAttributes.JobTitle); retUser.Company = ActiveDirectoryUtils.GetADObjectStringProperty(entry, ADAttributes.Company); @@ -513,10 +522,11 @@ namespace WebsitePanel.Providers.HostedSolution retUser.Zip = ActiveDirectoryUtils.GetADObjectStringProperty(entry, ADAttributes.Zip); retUser.Country = ActiveDirectoryUtils.GetADObjectStringProperty(entry, ADAttributes.Country); retUser.Notes = ActiveDirectoryUtils.GetADObjectStringProperty(entry, ADAttributes.Notes); - retUser.ExternalEmail = ActiveDirectoryUtils.GetADObjectStringProperty(entry, ADAttributes.ExternalEmail); - retUser.Disabled = (bool)entry.InvokeGet(ADAttributes.AccountDisabled); + retUser.ExternalEmail = ActiveDirectoryUtils.GetADObjectStringProperty(entry, ADAttributes.ExternalEmail); + retUser.Disabled = (bool)entry.InvokeGet(ADAttributes.AccountDisabled); retUser.Manager = GetManager(entry); - retUser.DomainUserName = GetDomainName(loginName); + retUser.SamAccountName = ActiveDirectoryUtils.GetADObjectStringProperty(entry, ADAttributes.SAMAccountName); + retUser.DomainUserName = GetDomainName(ActiveDirectoryUtils.GetADObjectStringProperty(entry, ADAttributes.SAMAccountName)); retUser.DistinguishedName = ActiveDirectoryUtils.GetADObjectStringProperty(entry, ADAttributes.DistinguishedName); retUser.Locked = (bool)entry.InvokeGet(ADAttributes.AccountLocked); @@ -578,7 +588,7 @@ namespace WebsitePanel.Providers.HostedSolution ActiveDirectoryUtils.SetADObjectProperty(entry, ADAttributes.FirstName, firstName); ActiveDirectoryUtils.SetADObjectProperty(entry, ADAttributes.LastName, lastName); ActiveDirectoryUtils.SetADObjectProperty(entry, ADAttributes.DisplayName, displayName); - + ActiveDirectoryUtils.SetADObjectProperty(entry, ADAttributes.Initials, initials); ActiveDirectoryUtils.SetADObjectProperty(entry, ADAttributes.JobTitle, jobTitle); ActiveDirectoryUtils.SetADObjectProperty(entry, ADAttributes.Company, company); @@ -596,7 +606,7 @@ namespace WebsitePanel.Providers.HostedSolution ActiveDirectoryUtils.SetADObjectProperty(entry, ADAttributes.Zip, zip); ActiveDirectoryUtils.SetADObjectProperty(entry, ADAttributes.Country, country); ActiveDirectoryUtils.SetADObjectProperty(entry, ADAttributes.Notes, notes); - ActiveDirectoryUtils.SetADObjectProperty(entry, ADAttributes.ExternalEmail, externalEmail); + ActiveDirectoryUtils.SetADObjectProperty(entry, ADAttributes.ExternalEmail, externalEmail); ActiveDirectoryUtils.SetADObjectProperty(entry, ADAttributes.CustomAttribute2, (disabled ? "disabled" : null)); @@ -626,6 +636,48 @@ namespace WebsitePanel.Providers.HostedSolution } + public string GetSamAccountNameByUserPrincipalName(string organizationId, string userPrincipalName) + { + return GetSamAccountNameByUserPrincipalNameInternal(organizationId, userPrincipalName); + } + + private string GetSamAccountNameByUserPrincipalNameInternal(string organizationId, string userPrincipalName) + { + HostedSolutionLog.LogStart("GetSamAccountNameByUserPrincipalNameInternal"); + HostedSolutionLog.DebugInfo("userPrincipalName : {0}", userPrincipalName); + HostedSolutionLog.DebugInfo("organizationId : {0}", organizationId); + + string accountName = string.Empty; + + try + { + + string path = GetOrganizationPath(organizationId); + DirectoryEntry entry = ActiveDirectoryUtils.GetADObject(path); + + DirectorySearcher searcher = new DirectorySearcher(entry); + searcher.PropertiesToLoad.Add("userPrincipalName"); + searcher.PropertiesToLoad.Add("sAMAccountName"); + searcher.Filter = "(userPrincipalName=" + userPrincipalName + ")"; + searcher.SearchScope = SearchScope.Subtree; + + SearchResult resCollection = searcher.FindOne(); + if (resCollection != null) + { + accountName = resCollection.Properties["samaccountname"][0].ToString(); + } + + HostedSolutionLog.LogEnd("GetSamAccountNameByUserPrincipalNameInternal"); + } + catch (Exception e) + { + HostedSolutionLog.DebugInfo("Failed : {0}", e.Message); + } + + return accountName; + } + + #endregion #region Domains diff --git a/WebsitePanel/Sources/WebsitePanel.Providers.HostedSolution/WebsitePanel.Providers.HostedSolution.csproj b/WebsitePanel/Sources/WebsitePanel.Providers.HostedSolution/WebsitePanel.Providers.HostedSolution.csproj index 7d5b2014..a1441425 100644 --- a/WebsitePanel/Sources/WebsitePanel.Providers.HostedSolution/WebsitePanel.Providers.HostedSolution.csproj +++ b/WebsitePanel/Sources/WebsitePanel.Providers.HostedSolution/WebsitePanel.Providers.HostedSolution.csproj @@ -131,6 +131,7 @@ + diff --git a/WebsitePanel/Sources/WebsitePanel.Server.Client/ExchangeServerProxy.cs b/WebsitePanel/Sources/WebsitePanel.Server.Client/ExchangeServerProxy.cs index 7514cfdf..e9fa92c9 100644 --- a/WebsitePanel/Sources/WebsitePanel.Server.Client/ExchangeServerProxy.cs +++ b/WebsitePanel/Sources/WebsitePanel.Server.Client/ExchangeServerProxy.cs @@ -1,31 +1,3 @@ -// Copyright (c) 2012, Outercurve Foundation. -// All rights reserved. -// -// Redistribution and use in source and binary forms, with or without modification, -// are permitted provided that the following conditions are met: -// -// - Redistributions of source code must retain the above copyright notice, this -// list of conditions and the following disclaimer. -// -// - Redistributions in binary form must reproduce the above copyright notice, -// this list of conditions and the following disclaimer in the documentation -// and/or other materials provided with the distribution. -// -// - Neither the name of the Outercurve Foundation nor the names of its -// contributors may be used to endorse or promote products derived from this -// software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR -// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON -// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - //------------------------------------------------------------------------------ // // This code was generated by a tool. @@ -39,9 +11,10 @@ // // This source code was auto-generated by wsdl, Version=2.0.50727.42. // + using WebsitePanel.Providers.HostedSolution; -namespace WebsitePanel.Providers.Exchange -{ + +namespace WebsitePanel.Providers.Exchange { using System.Xml.Serialization; using System.Web.Services; using System.ComponentModel; @@ -61,12 +34,6 @@ namespace WebsitePanel.Providers.Exchange public ServiceProviderSettingsSoapHeader ServiceProviderSettingsSoapHeaderValue; - private System.Threading.SendOrPostCallback WipeDataFromDeviceOperationCompleted; - - private System.Threading.SendOrPostCallback CancelRemoteWipeRequestOperationCompleted; - - private System.Threading.SendOrPostCallback RemoveDeviceOperationCompleted; - private System.Threading.SendOrPostCallback CheckAccountCredentialsOperationCompleted; private System.Threading.SendOrPostCallback ExtendToExchangeOrganizationOperationCompleted; @@ -79,6 +46,8 @@ namespace WebsitePanel.Providers.Exchange private System.Threading.SendOrPostCallback GetOABVirtualDirectoryOperationCompleted; + private System.Threading.SendOrPostCallback CreateOrganizationAddressBookPolicyOperationCompleted; + private System.Threading.SendOrPostCallback DeleteOrganizationOperationCompleted; private System.Threading.SendOrPostCallback SetOrganizationStorageLimitsOperationCompleted; @@ -91,8 +60,6 @@ namespace WebsitePanel.Providers.Exchange private System.Threading.SendOrPostCallback DeleteAuthoritativeDomainOperationCompleted; - private System.Threading.SendOrPostCallback CreateMailboxOperationCompleted; - private System.Threading.SendOrPostCallback DeleteMailboxOperationCompleted; private System.Threading.SendOrPostCallback DisableMailboxOperationCompleted; @@ -193,20 +160,17 @@ namespace WebsitePanel.Providers.Exchange private System.Threading.SendOrPostCallback GetMobileDeviceOperationCompleted; + private System.Threading.SendOrPostCallback WipeDataFromDeviceOperationCompleted; + + private System.Threading.SendOrPostCallback CancelRemoteWipeRequestOperationCompleted; + + private System.Threading.SendOrPostCallback RemoveDeviceOperationCompleted; + /// public ExchangeServer() { - this.Url = "http://localhost:9004/ExchangeServer.asmx"; + this.Url = "http://localhost:9006/ExchangeServer.asmx"; } - /// - public event WipeDataFromDeviceCompletedEventHandler WipeDataFromDeviceCompleted; - - /// - public event CancelRemoteWipeRequestCompletedEventHandler CancelRemoteWipeRequestCompleted; - - /// - public event RemoveDeviceCompletedEventHandler RemoveDeviceCompleted; - /// public event CheckAccountCredentialsCompletedEventHandler CheckAccountCredentialsCompleted; @@ -225,6 +189,9 @@ namespace WebsitePanel.Providers.Exchange /// public event GetOABVirtualDirectoryCompletedEventHandler GetOABVirtualDirectoryCompleted; + /// + public event CreateOrganizationAddressBookPolicyCompletedEventHandler CreateOrganizationAddressBookPolicyCompleted; + /// public event DeleteOrganizationCompletedEventHandler DeleteOrganizationCompleted; @@ -243,9 +210,6 @@ namespace WebsitePanel.Providers.Exchange /// public event DeleteAuthoritativeDomainCompletedEventHandler DeleteAuthoritativeDomainCompleted; - /// - public event CreateMailboxCompletedEventHandler CreateMailboxCompleted; - /// public event DeleteMailboxCompletedEventHandler DeleteMailboxCompleted; @@ -397,124 +361,13 @@ namespace WebsitePanel.Providers.Exchange public event GetMobileDeviceCompletedEventHandler GetMobileDeviceCompleted; /// - [System.Web.Services.Protocols.SoapHeaderAttribute("ServiceProviderSettingsSoapHeaderValue")] - [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://smbsaas/websitepanel/server/WipeDataFromDevice", RequestNamespace="http://smbsaas/websitepanel/server/", ResponseNamespace="http://smbsaas/websitepanel/server/", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] - public void WipeDataFromDevice(string id) { - this.Invoke("WipeDataFromDevice", new object[] { - id}); - } + public event WipeDataFromDeviceCompletedEventHandler WipeDataFromDeviceCompleted; /// - public System.IAsyncResult BeginWipeDataFromDevice(string id, System.AsyncCallback callback, object asyncState) { - return this.BeginInvoke("WipeDataFromDevice", new object[] { - id}, callback, asyncState); - } + public event CancelRemoteWipeRequestCompletedEventHandler CancelRemoteWipeRequestCompleted; /// - public void EndWipeDataFromDevice(System.IAsyncResult asyncResult) { - this.EndInvoke(asyncResult); - } - - /// - public void WipeDataFromDeviceAsync(string id) { - this.WipeDataFromDeviceAsync(id, null); - } - - /// - public void WipeDataFromDeviceAsync(string id, object userState) { - if ((this.WipeDataFromDeviceOperationCompleted == null)) { - this.WipeDataFromDeviceOperationCompleted = new System.Threading.SendOrPostCallback(this.OnWipeDataFromDeviceOperationCompleted); - } - this.InvokeAsync("WipeDataFromDevice", new object[] { - id}, this.WipeDataFromDeviceOperationCompleted, userState); - } - - private void OnWipeDataFromDeviceOperationCompleted(object arg) { - if ((this.WipeDataFromDeviceCompleted != null)) { - System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); - this.WipeDataFromDeviceCompleted(this, new System.ComponentModel.AsyncCompletedEventArgs(invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); - } - } - - /// - [System.Web.Services.Protocols.SoapHeaderAttribute("ServiceProviderSettingsSoapHeaderValue")] - [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://smbsaas/websitepanel/server/CancelRemoteWipeRequest", RequestNamespace="http://smbsaas/websitepanel/server/", ResponseNamespace="http://smbsaas/websitepanel/server/", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] - public void CancelRemoteWipeRequest(string id) { - this.Invoke("CancelRemoteWipeRequest", new object[] { - id}); - } - - /// - public System.IAsyncResult BeginCancelRemoteWipeRequest(string id, System.AsyncCallback callback, object asyncState) { - return this.BeginInvoke("CancelRemoteWipeRequest", new object[] { - id}, callback, asyncState); - } - - /// - public void EndCancelRemoteWipeRequest(System.IAsyncResult asyncResult) { - this.EndInvoke(asyncResult); - } - - /// - public void CancelRemoteWipeRequestAsync(string id) { - this.CancelRemoteWipeRequestAsync(id, null); - } - - /// - public void CancelRemoteWipeRequestAsync(string id, object userState) { - if ((this.CancelRemoteWipeRequestOperationCompleted == null)) { - this.CancelRemoteWipeRequestOperationCompleted = new System.Threading.SendOrPostCallback(this.OnCancelRemoteWipeRequestOperationCompleted); - } - this.InvokeAsync("CancelRemoteWipeRequest", new object[] { - id}, this.CancelRemoteWipeRequestOperationCompleted, userState); - } - - private void OnCancelRemoteWipeRequestOperationCompleted(object arg) { - if ((this.CancelRemoteWipeRequestCompleted != null)) { - System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); - this.CancelRemoteWipeRequestCompleted(this, new System.ComponentModel.AsyncCompletedEventArgs(invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); - } - } - - /// - [System.Web.Services.Protocols.SoapHeaderAttribute("ServiceProviderSettingsSoapHeaderValue")] - [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://smbsaas/websitepanel/server/RemoveDevice", RequestNamespace="http://smbsaas/websitepanel/server/", ResponseNamespace="http://smbsaas/websitepanel/server/", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] - public void RemoveDevice(string id) { - this.Invoke("RemoveDevice", new object[] { - id}); - } - - /// - public System.IAsyncResult BeginRemoveDevice(string id, System.AsyncCallback callback, object asyncState) { - return this.BeginInvoke("RemoveDevice", new object[] { - id}, callback, asyncState); - } - - /// - public void EndRemoveDevice(System.IAsyncResult asyncResult) { - this.EndInvoke(asyncResult); - } - - /// - public void RemoveDeviceAsync(string id) { - this.RemoveDeviceAsync(id, null); - } - - /// - public void RemoveDeviceAsync(string id, object userState) { - if ((this.RemoveDeviceOperationCompleted == null)) { - this.RemoveDeviceOperationCompleted = new System.Threading.SendOrPostCallback(this.OnRemoveDeviceOperationCompleted); - } - this.InvokeAsync("RemoveDevice", new object[] { - id}, this.RemoveDeviceOperationCompleted, userState); - } - - private void OnRemoveDeviceOperationCompleted(object arg) { - if ((this.RemoveDeviceCompleted != null)) { - System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); - this.RemoveDeviceCompleted(this, new System.ComponentModel.AsyncCompletedEventArgs(invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); - } - } + public event RemoveDeviceCompletedEventHandler RemoveDeviceCompleted; /// [System.Web.Services.Protocols.SoapHeaderAttribute("ServiceProviderSettingsSoapHeaderValue")] @@ -564,18 +417,20 @@ namespace WebsitePanel.Providers.Exchange /// [System.Web.Services.Protocols.SoapHeaderAttribute("ServiceProviderSettingsSoapHeaderValue")] [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://smbsaas/websitepanel/server/ExtendToExchangeOrganization", RequestNamespace="http://smbsaas/websitepanel/server/", ResponseNamespace="http://smbsaas/websitepanel/server/", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] - public Organization ExtendToExchangeOrganization(string organizationId, string securityGroup) { + public Organization ExtendToExchangeOrganization(string organizationId, string securityGroup, bool IsConsumer) { object[] results = this.Invoke("ExtendToExchangeOrganization", new object[] { organizationId, - securityGroup}); + securityGroup, + IsConsumer}); return ((Organization)(results[0])); } /// - public System.IAsyncResult BeginExtendToExchangeOrganization(string organizationId, string securityGroup, System.AsyncCallback callback, object asyncState) { + public System.IAsyncResult BeginExtendToExchangeOrganization(string organizationId, string securityGroup, bool IsConsumer, System.AsyncCallback callback, object asyncState) { return this.BeginInvoke("ExtendToExchangeOrganization", new object[] { organizationId, - securityGroup}, callback, asyncState); + securityGroup, + IsConsumer}, callback, asyncState); } /// @@ -585,18 +440,19 @@ namespace WebsitePanel.Providers.Exchange } /// - public void ExtendToExchangeOrganizationAsync(string organizationId, string securityGroup) { - this.ExtendToExchangeOrganizationAsync(organizationId, securityGroup, null); + public void ExtendToExchangeOrganizationAsync(string organizationId, string securityGroup, bool IsConsumer) { + this.ExtendToExchangeOrganizationAsync(organizationId, securityGroup, IsConsumer, null); } /// - public void ExtendToExchangeOrganizationAsync(string organizationId, string securityGroup, object userState) { + public void ExtendToExchangeOrganizationAsync(string organizationId, string securityGroup, bool IsConsumer, object userState) { if ((this.ExtendToExchangeOrganizationOperationCompleted == null)) { this.ExtendToExchangeOrganizationOperationCompleted = new System.Threading.SendOrPostCallback(this.OnExtendToExchangeOrganizationOperationCompleted); } this.InvokeAsync("ExtendToExchangeOrganization", new object[] { organizationId, - securityGroup}, this.ExtendToExchangeOrganizationOperationCompleted, userState); + securityGroup, + IsConsumer}, this.ExtendToExchangeOrganizationOperationCompleted, userState); } private void OnExtendToExchangeOrganizationOperationCompleted(object arg) { @@ -616,6 +472,7 @@ namespace WebsitePanel.Providers.Exchange ExchangeAccountType accountType, string mailboxDatabase, string offlineAddressBook, + string addressBookPolicy, string accountName, bool enablePOP, bool enableIMAP, @@ -625,7 +482,12 @@ namespace WebsitePanel.Providers.Exchange int issueWarningKB, int prohibitSendKB, int prohibitSendReceiveKB, - int keepDeletedItemsDays) { + int keepDeletedItemsDays, + int maxRecipients, + int maxSendMessageSizeKB, + int maxReceiveMessageSizeKB, + bool hideFromAddressBook, + bool isConsumer) { object[] results = this.Invoke("CreateMailEnableUser", new object[] { upn, organizationId, @@ -633,6 +495,7 @@ namespace WebsitePanel.Providers.Exchange accountType, mailboxDatabase, offlineAddressBook, + addressBookPolicy, accountName, enablePOP, enableIMAP, @@ -642,7 +505,12 @@ namespace WebsitePanel.Providers.Exchange issueWarningKB, prohibitSendKB, prohibitSendReceiveKB, - keepDeletedItemsDays}); + keepDeletedItemsDays, + maxRecipients, + maxSendMessageSizeKB, + maxReceiveMessageSizeKB, + hideFromAddressBook, + isConsumer}); return ((string)(results[0])); } @@ -654,6 +522,7 @@ namespace WebsitePanel.Providers.Exchange ExchangeAccountType accountType, string mailboxDatabase, string offlineAddressBook, + string addressBookPolicy, string accountName, bool enablePOP, bool enableIMAP, @@ -664,6 +533,11 @@ namespace WebsitePanel.Providers.Exchange int prohibitSendKB, int prohibitSendReceiveKB, int keepDeletedItemsDays, + int maxRecipients, + int maxSendMessageSizeKB, + int maxReceiveMessageSizeKB, + bool hideFromAddressBook, + bool isConsumer, System.AsyncCallback callback, object asyncState) { return this.BeginInvoke("CreateMailEnableUser", new object[] { @@ -673,6 +547,7 @@ namespace WebsitePanel.Providers.Exchange accountType, mailboxDatabase, offlineAddressBook, + addressBookPolicy, accountName, enablePOP, enableIMAP, @@ -682,7 +557,12 @@ namespace WebsitePanel.Providers.Exchange issueWarningKB, prohibitSendKB, prohibitSendReceiveKB, - keepDeletedItemsDays}, callback, asyncState); + keepDeletedItemsDays, + maxRecipients, + maxSendMessageSizeKB, + maxReceiveMessageSizeKB, + hideFromAddressBook, + isConsumer}, callback, asyncState); } /// @@ -699,27 +579,7 @@ namespace WebsitePanel.Providers.Exchange ExchangeAccountType accountType, string mailboxDatabase, string offlineAddressBook, - string accountName, - bool enablePOP, - bool enableIMAP, - bool enableOWA, - bool enableMAPI, - bool enableActiveSync, - int issueWarningKB, - int prohibitSendKB, - int prohibitSendReceiveKB, - int keepDeletedItemsDays) { - this.CreateMailEnableUserAsync(upn, organizationId, organizationDistinguishedName, accountType, mailboxDatabase, offlineAddressBook, accountName, enablePOP, enableIMAP, enableOWA, enableMAPI, enableActiveSync, issueWarningKB, prohibitSendKB, prohibitSendReceiveKB, keepDeletedItemsDays, null); - } - - /// - public void CreateMailEnableUserAsync( - string upn, - string organizationId, - string organizationDistinguishedName, - ExchangeAccountType accountType, - string mailboxDatabase, - string offlineAddressBook, + string addressBookPolicy, string accountName, bool enablePOP, bool enableIMAP, @@ -730,6 +590,38 @@ namespace WebsitePanel.Providers.Exchange int prohibitSendKB, int prohibitSendReceiveKB, int keepDeletedItemsDays, + int maxRecipients, + int maxSendMessageSizeKB, + int maxReceiveMessageSizeKB, + bool hideFromAddressBook, + bool isConsumer) { + this.CreateMailEnableUserAsync(upn, organizationId, organizationDistinguishedName, accountType, mailboxDatabase, offlineAddressBook, addressBookPolicy, accountName, enablePOP, enableIMAP, enableOWA, enableMAPI, enableActiveSync, issueWarningKB, prohibitSendKB, prohibitSendReceiveKB, keepDeletedItemsDays, maxRecipients, maxSendMessageSizeKB, maxReceiveMessageSizeKB, hideFromAddressBook, isConsumer, null); + } + + /// + public void CreateMailEnableUserAsync( + string upn, + string organizationId, + string organizationDistinguishedName, + ExchangeAccountType accountType, + string mailboxDatabase, + string offlineAddressBook, + string addressBookPolicy, + string accountName, + bool enablePOP, + bool enableIMAP, + bool enableOWA, + bool enableMAPI, + bool enableActiveSync, + int issueWarningKB, + int prohibitSendKB, + int prohibitSendReceiveKB, + int keepDeletedItemsDays, + int maxRecipients, + int maxSendMessageSizeKB, + int maxReceiveMessageSizeKB, + bool hideFromAddressBook, + bool isConsumer, object userState) { if ((this.CreateMailEnableUserOperationCompleted == null)) { this.CreateMailEnableUserOperationCompleted = new System.Threading.SendOrPostCallback(this.OnCreateMailEnableUserOperationCompleted); @@ -741,6 +633,7 @@ namespace WebsitePanel.Providers.Exchange accountType, mailboxDatabase, offlineAddressBook, + addressBookPolicy, accountName, enablePOP, enableIMAP, @@ -750,7 +643,12 @@ namespace WebsitePanel.Providers.Exchange issueWarningKB, prohibitSendKB, prohibitSendReceiveKB, - keepDeletedItemsDays}, this.CreateMailEnableUserOperationCompleted, userState); + keepDeletedItemsDays, + maxRecipients, + maxSendMessageSizeKB, + maxReceiveMessageSizeKB, + hideFromAddressBook, + isConsumer}, this.CreateMailEnableUserOperationCompleted, userState); } private void OnCreateMailEnableUserOperationCompleted(object arg) { @@ -887,31 +785,87 @@ namespace WebsitePanel.Providers.Exchange } } + /// + [System.Web.Services.Protocols.SoapHeaderAttribute("ServiceProviderSettingsSoapHeaderValue")] + [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://smbsaas/websitepanel/server/CreateOrganizationAddressBookPolicy", RequestNamespace="http://smbsaas/websitepanel/server/", ResponseNamespace="http://smbsaas/websitepanel/server/", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] + public Organization CreateOrganizationAddressBookPolicy(string organizationId, string gal, string addressBook, string roomList, string oab) { + object[] results = this.Invoke("CreateOrganizationAddressBookPolicy", new object[] { + organizationId, + gal, + addressBook, + roomList, + oab}); + return ((Organization)(results[0])); + } + + /// + public System.IAsyncResult BeginCreateOrganizationAddressBookPolicy(string organizationId, string gal, string addressBook, string roomList, string oab, System.AsyncCallback callback, object asyncState) { + return this.BeginInvoke("CreateOrganizationAddressBookPolicy", new object[] { + organizationId, + gal, + addressBook, + roomList, + oab}, callback, asyncState); + } + + /// + public Organization EndCreateOrganizationAddressBookPolicy(System.IAsyncResult asyncResult) { + object[] results = this.EndInvoke(asyncResult); + return ((Organization)(results[0])); + } + + /// + public void CreateOrganizationAddressBookPolicyAsync(string organizationId, string gal, string addressBook, string roomList, string oab) { + this.CreateOrganizationAddressBookPolicyAsync(organizationId, gal, addressBook, roomList, oab, null); + } + + /// + public void CreateOrganizationAddressBookPolicyAsync(string organizationId, string gal, string addressBook, string roomList, string oab, object userState) { + if ((this.CreateOrganizationAddressBookPolicyOperationCompleted == null)) { + this.CreateOrganizationAddressBookPolicyOperationCompleted = new System.Threading.SendOrPostCallback(this.OnCreateOrganizationAddressBookPolicyOperationCompleted); + } + this.InvokeAsync("CreateOrganizationAddressBookPolicy", new object[] { + organizationId, + gal, + addressBook, + roomList, + oab}, this.CreateOrganizationAddressBookPolicyOperationCompleted, userState); + } + + private void OnCreateOrganizationAddressBookPolicyOperationCompleted(object arg) { + if ((this.CreateOrganizationAddressBookPolicyCompleted != null)) { + System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); + this.CreateOrganizationAddressBookPolicyCompleted(this, new CreateOrganizationAddressBookPolicyCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); + } + } + /// [System.Web.Services.Protocols.SoapHeaderAttribute("ServiceProviderSettingsSoapHeaderValue")] [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://smbsaas/websitepanel/server/DeleteOrganization", RequestNamespace="http://smbsaas/websitepanel/server/", ResponseNamespace="http://smbsaas/websitepanel/server/", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] - public bool DeleteOrganization(string organizationId, string distinguishedName, string globalAddressList, string addressList, string roomsAddressList, string offlineAddressBook, string securityGroup) { + public bool DeleteOrganization(string organizationId, string distinguishedName, string globalAddressList, string addressList, string roomList, string offlineAddressBook, string securityGroup, string addressBookPolicy) { object[] results = this.Invoke("DeleteOrganization", new object[] { organizationId, distinguishedName, globalAddressList, addressList, - roomsAddressList, + roomList, offlineAddressBook, - securityGroup}); + securityGroup, + addressBookPolicy}); return ((bool)(results[0])); } /// - public System.IAsyncResult BeginDeleteOrganization(string organizationId, string distinguishedName, string globalAddressList, string addressList, string roomsAddressList, string offlineAddressBook, string securityGroup, System.AsyncCallback callback, object asyncState) { + public System.IAsyncResult BeginDeleteOrganization(string organizationId, string distinguishedName, string globalAddressList, string addressList, string roomList, string offlineAddressBook, string securityGroup, string addressBookPolicy, System.AsyncCallback callback, object asyncState) { return this.BeginInvoke("DeleteOrganization", new object[] { organizationId, distinguishedName, globalAddressList, addressList, - roomsAddressList, + roomList, offlineAddressBook, - securityGroup}, callback, asyncState); + securityGroup, + addressBookPolicy}, callback, asyncState); } /// @@ -921,12 +875,12 @@ namespace WebsitePanel.Providers.Exchange } /// - public void DeleteOrganizationAsync(string organizationId, string distinguishedName, string globalAddressList, string addressList, string roomsAddressList, string offlineAddressBook, string securityGroup) { - this.DeleteOrganizationAsync(organizationId, distinguishedName, globalAddressList, addressList, roomsAddressList, offlineAddressBook, securityGroup, null); + public void DeleteOrganizationAsync(string organizationId, string distinguishedName, string globalAddressList, string addressList, string roomList, string offlineAddressBook, string securityGroup, string addressBookPolicy) { + this.DeleteOrganizationAsync(organizationId, distinguishedName, globalAddressList, addressList, roomList, offlineAddressBook, securityGroup, addressBookPolicy, null); } /// - public void DeleteOrganizationAsync(string organizationId, string distinguishedName, string globalAddressList, string addressList, string roomsAddressList, string offlineAddressBook, string securityGroup, object userState) { + public void DeleteOrganizationAsync(string organizationId, string distinguishedName, string globalAddressList, string addressList, string roomList, string offlineAddressBook, string securityGroup, string addressBookPolicy, object userState) { if ((this.DeleteOrganizationOperationCompleted == null)) { this.DeleteOrganizationOperationCompleted = new System.Threading.SendOrPostCallback(this.OnDeleteOrganizationOperationCompleted); } @@ -935,9 +889,10 @@ namespace WebsitePanel.Providers.Exchange distinguishedName, globalAddressList, addressList, - roomsAddressList, + roomList, offlineAddressBook, - securityGroup}, this.DeleteOrganizationOperationCompleted, userState); + securityGroup, + addressBookPolicy}, this.DeleteOrganizationOperationCompleted, userState); } private void OnDeleteOrganizationOperationCompleted(object arg) { @@ -1160,188 +1115,6 @@ namespace WebsitePanel.Providers.Exchange } } - /// - [System.Web.Services.Protocols.SoapHeaderAttribute("ServiceProviderSettingsSoapHeaderValue")] - [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://smbsaas/websitepanel/server/CreateMailbox", RequestNamespace="http://smbsaas/websitepanel/server/", ResponseNamespace="http://smbsaas/websitepanel/server/", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] - public string CreateMailbox( - string organizationId, - string organizationDistinguishedName, - string mailboxDatabase, - string securityGroup, - string offlineAddressBook, - ExchangeAccountType accountType, - string displayName, - string accountName, - string name, - string domain, - string password, - bool enablePOP, - bool enableIMAP, - bool enableOWA, - bool enableMAPI, - bool enableActiveSync, - int issueWarningKB, - int prohibitSendKB, - int prohibitSendReceiveKB, - int keepDeletedItemsDays) { - object[] results = this.Invoke("CreateMailbox", new object[] { - organizationId, - organizationDistinguishedName, - mailboxDatabase, - securityGroup, - offlineAddressBook, - accountType, - displayName, - accountName, - name, - domain, - password, - enablePOP, - enableIMAP, - enableOWA, - enableMAPI, - enableActiveSync, - issueWarningKB, - prohibitSendKB, - prohibitSendReceiveKB, - keepDeletedItemsDays}); - return ((string)(results[0])); - } - - /// - public System.IAsyncResult BeginCreateMailbox( - string organizationId, - string organizationDistinguishedName, - string mailboxDatabase, - string securityGroup, - string offlineAddressBook, - ExchangeAccountType accountType, - string displayName, - string accountName, - string name, - string domain, - string password, - bool enablePOP, - bool enableIMAP, - bool enableOWA, - bool enableMAPI, - bool enableActiveSync, - int issueWarningKB, - int prohibitSendKB, - int prohibitSendReceiveKB, - int keepDeletedItemsDays, - System.AsyncCallback callback, - object asyncState) { - return this.BeginInvoke("CreateMailbox", new object[] { - organizationId, - organizationDistinguishedName, - mailboxDatabase, - securityGroup, - offlineAddressBook, - accountType, - displayName, - accountName, - name, - domain, - password, - enablePOP, - enableIMAP, - enableOWA, - enableMAPI, - enableActiveSync, - issueWarningKB, - prohibitSendKB, - prohibitSendReceiveKB, - keepDeletedItemsDays}, callback, asyncState); - } - - /// - public string EndCreateMailbox(System.IAsyncResult asyncResult) { - object[] results = this.EndInvoke(asyncResult); - return ((string)(results[0])); - } - - /// - public void CreateMailboxAsync( - string organizationId, - string organizationDistinguishedName, - string mailboxDatabase, - string securityGroup, - string offlineAddressBook, - ExchangeAccountType accountType, - string displayName, - string accountName, - string name, - string domain, - string password, - bool enablePOP, - bool enableIMAP, - bool enableOWA, - bool enableMAPI, - bool enableActiveSync, - int issueWarningKB, - int prohibitSendKB, - int prohibitSendReceiveKB, - int keepDeletedItemsDays) { - this.CreateMailboxAsync(organizationId, organizationDistinguishedName, mailboxDatabase, securityGroup, offlineAddressBook, accountType, displayName, accountName, name, domain, password, enablePOP, enableIMAP, enableOWA, enableMAPI, enableActiveSync, issueWarningKB, prohibitSendKB, prohibitSendReceiveKB, keepDeletedItemsDays, null); - } - - /// - public void CreateMailboxAsync( - string organizationId, - string organizationDistinguishedName, - string mailboxDatabase, - string securityGroup, - string offlineAddressBook, - ExchangeAccountType accountType, - string displayName, - string accountName, - string name, - string domain, - string password, - bool enablePOP, - bool enableIMAP, - bool enableOWA, - bool enableMAPI, - bool enableActiveSync, - int issueWarningKB, - int prohibitSendKB, - int prohibitSendReceiveKB, - int keepDeletedItemsDays, - object userState) { - if ((this.CreateMailboxOperationCompleted == null)) { - this.CreateMailboxOperationCompleted = new System.Threading.SendOrPostCallback(this.OnCreateMailboxOperationCompleted); - } - this.InvokeAsync("CreateMailbox", new object[] { - organizationId, - organizationDistinguishedName, - mailboxDatabase, - securityGroup, - offlineAddressBook, - accountType, - displayName, - accountName, - name, - domain, - password, - enablePOP, - enableIMAP, - enableOWA, - enableMAPI, - enableActiveSync, - issueWarningKB, - prohibitSendKB, - prohibitSendReceiveKB, - keepDeletedItemsDays}, this.CreateMailboxOperationCompleted, userState); - } - - private void OnCreateMailboxOperationCompleted(object arg) { - if ((this.CreateMailboxCompleted != null)) { - System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); - this.CreateMailboxCompleted(this, new CreateMailboxCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); - } - } - /// [System.Web.Services.Protocols.SoapHeaderAttribute("ServiceProviderSettingsSoapHeaderValue")] [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://smbsaas/websitepanel/server/DeleteMailbox", RequestNamespace="http://smbsaas/websitepanel/server/", ResponseNamespace="http://smbsaas/websitepanel/server/", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] @@ -1467,115 +1240,19 @@ namespace WebsitePanel.Providers.Exchange /// [System.Web.Services.Protocols.SoapHeaderAttribute("ServiceProviderSettingsSoapHeaderValue")] [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://smbsaas/websitepanel/server/SetMailboxGeneralSettings", RequestNamespace="http://smbsaas/websitepanel/server/", ResponseNamespace="http://smbsaas/websitepanel/server/", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] - public void SetMailboxGeneralSettings( - string accountName, - string displayName, - string password, - bool hideFromAddressBook, - bool disabled, - string firstName, - string initials, - string lastName, - string address, - string city, - string state, - string zip, - string country, - string jobTitle, - string company, - string department, - string office, - string managerAccountName, - string businessPhone, - string fax, - string homePhone, - string mobilePhone, - string pager, - string webPage, - string notes) { + public void SetMailboxGeneralSettings(string accountName, bool hideFromAddressBook, bool disabled) { this.Invoke("SetMailboxGeneralSettings", new object[] { accountName, - displayName, - password, hideFromAddressBook, - disabled, - firstName, - initials, - lastName, - address, - city, - state, - zip, - country, - jobTitle, - company, - department, - office, - managerAccountName, - businessPhone, - fax, - homePhone, - mobilePhone, - pager, - webPage, - notes}); + disabled}); } /// - public System.IAsyncResult BeginSetMailboxGeneralSettings( - string accountName, - string displayName, - string password, - bool hideFromAddressBook, - bool disabled, - string firstName, - string initials, - string lastName, - string address, - string city, - string state, - string zip, - string country, - string jobTitle, - string company, - string department, - string office, - string managerAccountName, - string businessPhone, - string fax, - string homePhone, - string mobilePhone, - string pager, - string webPage, - string notes, - System.AsyncCallback callback, - object asyncState) { + public System.IAsyncResult BeginSetMailboxGeneralSettings(string accountName, bool hideFromAddressBook, bool disabled, System.AsyncCallback callback, object asyncState) { return this.BeginInvoke("SetMailboxGeneralSettings", new object[] { accountName, - displayName, - password, hideFromAddressBook, - disabled, - firstName, - initials, - lastName, - address, - city, - state, - zip, - country, - jobTitle, - company, - department, - office, - managerAccountName, - businessPhone, - fax, - homePhone, - mobilePhone, - pager, - webPage, - notes}, callback, asyncState); + disabled}, callback, asyncState); } /// @@ -1584,92 +1261,19 @@ namespace WebsitePanel.Providers.Exchange } /// - public void SetMailboxGeneralSettingsAsync( - string accountName, - string displayName, - string password, - bool hideFromAddressBook, - bool disabled, - string firstName, - string initials, - string lastName, - string address, - string city, - string state, - string zip, - string country, - string jobTitle, - string company, - string department, - string office, - string managerAccountName, - string businessPhone, - string fax, - string homePhone, - string mobilePhone, - string pager, - string webPage, - string notes) { - this.SetMailboxGeneralSettingsAsync(accountName, displayName, password, hideFromAddressBook, disabled, firstName, initials, lastName, address, city, state, zip, country, jobTitle, company, department, office, managerAccountName, businessPhone, fax, homePhone, mobilePhone, pager, webPage, notes, null); + public void SetMailboxGeneralSettingsAsync(string accountName, bool hideFromAddressBook, bool disabled) { + this.SetMailboxGeneralSettingsAsync(accountName, hideFromAddressBook, disabled, null); } /// - public void SetMailboxGeneralSettingsAsync( - string accountName, - string displayName, - string password, - bool hideFromAddressBook, - bool disabled, - string firstName, - string initials, - string lastName, - string address, - string city, - string state, - string zip, - string country, - string jobTitle, - string company, - string department, - string office, - string managerAccountName, - string businessPhone, - string fax, - string homePhone, - string mobilePhone, - string pager, - string webPage, - string notes, - object userState) { + public void SetMailboxGeneralSettingsAsync(string accountName, bool hideFromAddressBook, bool disabled, object userState) { if ((this.SetMailboxGeneralSettingsOperationCompleted == null)) { this.SetMailboxGeneralSettingsOperationCompleted = new System.Threading.SendOrPostCallback(this.OnSetMailboxGeneralSettingsOperationCompleted); } this.InvokeAsync("SetMailboxGeneralSettings", new object[] { accountName, - displayName, - password, hideFromAddressBook, - disabled, - firstName, - initials, - lastName, - address, - city, - state, - zip, - country, - jobTitle, - company, - department, - office, - managerAccountName, - businessPhone, - fax, - homePhone, - mobilePhone, - pager, - webPage, - notes}, this.SetMailboxGeneralSettingsOperationCompleted, userState); + disabled}, this.SetMailboxGeneralSettingsOperationCompleted, userState); } private void OnSetMailboxGeneralSettingsOperationCompleted(object arg) { @@ -1724,7 +1328,7 @@ namespace WebsitePanel.Providers.Exchange /// [System.Web.Services.Protocols.SoapHeaderAttribute("ServiceProviderSettingsSoapHeaderValue")] [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://smbsaas/websitepanel/server/SetMailboxMailFlowSettings", RequestNamespace="http://smbsaas/websitepanel/server/", ResponseNamespace="http://smbsaas/websitepanel/server/", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] - public void SetMailboxMailFlowSettings(string accountName, bool enableForwarding, string forwardingAccountName, bool forwardToBoth, string[] sendOnBehalfAccounts, string[] acceptAccounts, string[] rejectAccounts, int maxRecipients, int maxSendMessageSizeKB, int maxReceiveMessageSizeKB, bool requireSenderAuthentication) { + public void SetMailboxMailFlowSettings(string accountName, bool enableForwarding, string forwardingAccountName, bool forwardToBoth, string[] sendOnBehalfAccounts, string[] acceptAccounts, string[] rejectAccounts, bool requireSenderAuthentication) { this.Invoke("SetMailboxMailFlowSettings", new object[] { accountName, enableForwarding, @@ -1733,14 +1337,11 @@ namespace WebsitePanel.Providers.Exchange sendOnBehalfAccounts, acceptAccounts, rejectAccounts, - maxRecipients, - maxSendMessageSizeKB, - maxReceiveMessageSizeKB, requireSenderAuthentication}); } /// - public System.IAsyncResult BeginSetMailboxMailFlowSettings(string accountName, bool enableForwarding, string forwardingAccountName, bool forwardToBoth, string[] sendOnBehalfAccounts, string[] acceptAccounts, string[] rejectAccounts, int maxRecipients, int maxSendMessageSizeKB, int maxReceiveMessageSizeKB, bool requireSenderAuthentication, System.AsyncCallback callback, object asyncState) { + public System.IAsyncResult BeginSetMailboxMailFlowSettings(string accountName, bool enableForwarding, string forwardingAccountName, bool forwardToBoth, string[] sendOnBehalfAccounts, string[] acceptAccounts, string[] rejectAccounts, bool requireSenderAuthentication, System.AsyncCallback callback, object asyncState) { return this.BeginInvoke("SetMailboxMailFlowSettings", new object[] { accountName, enableForwarding, @@ -1749,9 +1350,6 @@ namespace WebsitePanel.Providers.Exchange sendOnBehalfAccounts, acceptAccounts, rejectAccounts, - maxRecipients, - maxSendMessageSizeKB, - maxReceiveMessageSizeKB, requireSenderAuthentication}, callback, asyncState); } @@ -1761,12 +1359,12 @@ namespace WebsitePanel.Providers.Exchange } /// - public void SetMailboxMailFlowSettingsAsync(string accountName, bool enableForwarding, string forwardingAccountName, bool forwardToBoth, string[] sendOnBehalfAccounts, string[] acceptAccounts, string[] rejectAccounts, int maxRecipients, int maxSendMessageSizeKB, int maxReceiveMessageSizeKB, bool requireSenderAuthentication) { - this.SetMailboxMailFlowSettingsAsync(accountName, enableForwarding, forwardingAccountName, forwardToBoth, sendOnBehalfAccounts, acceptAccounts, rejectAccounts, maxRecipients, maxSendMessageSizeKB, maxReceiveMessageSizeKB, requireSenderAuthentication, null); + public void SetMailboxMailFlowSettingsAsync(string accountName, bool enableForwarding, string forwardingAccountName, bool forwardToBoth, string[] sendOnBehalfAccounts, string[] acceptAccounts, string[] rejectAccounts, bool requireSenderAuthentication) { + this.SetMailboxMailFlowSettingsAsync(accountName, enableForwarding, forwardingAccountName, forwardToBoth, sendOnBehalfAccounts, acceptAccounts, rejectAccounts, requireSenderAuthentication, null); } /// - public void SetMailboxMailFlowSettingsAsync(string accountName, bool enableForwarding, string forwardingAccountName, bool forwardToBoth, string[] sendOnBehalfAccounts, string[] acceptAccounts, string[] rejectAccounts, int maxRecipients, int maxSendMessageSizeKB, int maxReceiveMessageSizeKB, bool requireSenderAuthentication, object userState) { + public void SetMailboxMailFlowSettingsAsync(string accountName, bool enableForwarding, string forwardingAccountName, bool forwardToBoth, string[] sendOnBehalfAccounts, string[] acceptAccounts, string[] rejectAccounts, bool requireSenderAuthentication, object userState) { if ((this.SetMailboxMailFlowSettingsOperationCompleted == null)) { this.SetMailboxMailFlowSettingsOperationCompleted = new System.Threading.SendOrPostCallback(this.OnSetMailboxMailFlowSettingsOperationCompleted); } @@ -1778,9 +1376,6 @@ namespace WebsitePanel.Providers.Exchange sendOnBehalfAccounts, acceptAccounts, rejectAccounts, - maxRecipients, - maxSendMessageSizeKB, - maxReceiveMessageSizeKB, requireSenderAuthentication}, this.SetMailboxMailFlowSettingsOperationCompleted, userState); } @@ -1836,7 +1431,7 @@ namespace WebsitePanel.Providers.Exchange /// [System.Web.Services.Protocols.SoapHeaderAttribute("ServiceProviderSettingsSoapHeaderValue")] [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://smbsaas/websitepanel/server/SetMailboxAdvancedSettings", RequestNamespace="http://smbsaas/websitepanel/server/", ResponseNamespace="http://smbsaas/websitepanel/server/", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] - public void SetMailboxAdvancedSettings(string organizationId, string accountName, bool enablePOP, bool enableIMAP, bool enableOWA, bool enableMAPI, bool enableActiveSync, int issueWarningKB, int prohibitSendKB, int prohibitSendReceiveKB, int keepDeletedItemsDays) { + public void SetMailboxAdvancedSettings(string organizationId, string accountName, bool enablePOP, bool enableIMAP, bool enableOWA, bool enableMAPI, bool enableActiveSync, int issueWarningKB, int prohibitSendKB, int prohibitSendReceiveKB, int keepDeletedItemsDays, int maxRecipients, int maxSendMessageSizeKB, int maxReceiveMessageSizeKB) { this.Invoke("SetMailboxAdvancedSettings", new object[] { organizationId, accountName, @@ -1848,11 +1443,30 @@ namespace WebsitePanel.Providers.Exchange issueWarningKB, prohibitSendKB, prohibitSendReceiveKB, - keepDeletedItemsDays}); + keepDeletedItemsDays, + maxRecipients, + maxSendMessageSizeKB, + maxReceiveMessageSizeKB}); } /// - public System.IAsyncResult BeginSetMailboxAdvancedSettings(string organizationId, string accountName, bool enablePOP, bool enableIMAP, bool enableOWA, bool enableMAPI, bool enableActiveSync, int issueWarningKB, int prohibitSendKB, int prohibitSendReceiveKB, int keepDeletedItemsDays, System.AsyncCallback callback, object asyncState) { + public System.IAsyncResult BeginSetMailboxAdvancedSettings( + string organizationId, + string accountName, + bool enablePOP, + bool enableIMAP, + bool enableOWA, + bool enableMAPI, + bool enableActiveSync, + int issueWarningKB, + int prohibitSendKB, + int prohibitSendReceiveKB, + int keepDeletedItemsDays, + int maxRecipients, + int maxSendMessageSizeKB, + int maxReceiveMessageSizeKB, + System.AsyncCallback callback, + object asyncState) { return this.BeginInvoke("SetMailboxAdvancedSettings", new object[] { organizationId, accountName, @@ -1864,7 +1478,10 @@ namespace WebsitePanel.Providers.Exchange issueWarningKB, prohibitSendKB, prohibitSendReceiveKB, - keepDeletedItemsDays}, callback, asyncState); + keepDeletedItemsDays, + maxRecipients, + maxSendMessageSizeKB, + maxReceiveMessageSizeKB}, callback, asyncState); } /// @@ -1873,12 +1490,12 @@ namespace WebsitePanel.Providers.Exchange } /// - public void SetMailboxAdvancedSettingsAsync(string organizationId, string accountName, bool enablePOP, bool enableIMAP, bool enableOWA, bool enableMAPI, bool enableActiveSync, int issueWarningKB, int prohibitSendKB, int prohibitSendReceiveKB, int keepDeletedItemsDays) { - this.SetMailboxAdvancedSettingsAsync(organizationId, accountName, enablePOP, enableIMAP, enableOWA, enableMAPI, enableActiveSync, issueWarningKB, prohibitSendKB, prohibitSendReceiveKB, keepDeletedItemsDays, null); + public void SetMailboxAdvancedSettingsAsync(string organizationId, string accountName, bool enablePOP, bool enableIMAP, bool enableOWA, bool enableMAPI, bool enableActiveSync, int issueWarningKB, int prohibitSendKB, int prohibitSendReceiveKB, int keepDeletedItemsDays, int maxRecipients, int maxSendMessageSizeKB, int maxReceiveMessageSizeKB) { + this.SetMailboxAdvancedSettingsAsync(organizationId, accountName, enablePOP, enableIMAP, enableOWA, enableMAPI, enableActiveSync, issueWarningKB, prohibitSendKB, prohibitSendReceiveKB, keepDeletedItemsDays, maxRecipients, maxSendMessageSizeKB, maxReceiveMessageSizeKB, null); } /// - public void SetMailboxAdvancedSettingsAsync(string organizationId, string accountName, bool enablePOP, bool enableIMAP, bool enableOWA, bool enableMAPI, bool enableActiveSync, int issueWarningKB, int prohibitSendKB, int prohibitSendReceiveKB, int keepDeletedItemsDays, object userState) { + public void SetMailboxAdvancedSettingsAsync(string organizationId, string accountName, bool enablePOP, bool enableIMAP, bool enableOWA, bool enableMAPI, bool enableActiveSync, int issueWarningKB, int prohibitSendKB, int prohibitSendReceiveKB, int keepDeletedItemsDays, int maxRecipients, int maxSendMessageSizeKB, int maxReceiveMessageSizeKB, object userState) { if ((this.SetMailboxAdvancedSettingsOperationCompleted == null)) { this.SetMailboxAdvancedSettingsOperationCompleted = new System.Threading.SendOrPostCallback(this.OnSetMailboxAdvancedSettingsOperationCompleted); } @@ -1893,7 +1510,10 @@ namespace WebsitePanel.Providers.Exchange issueWarningKB, prohibitSendKB, prohibitSendReceiveKB, - keepDeletedItemsDays}, this.SetMailboxAdvancedSettingsOperationCompleted, userState); + keepDeletedItemsDays, + maxRecipients, + maxSendMessageSizeKB, + maxReceiveMessageSizeKB}, this.SetMailboxAdvancedSettingsOperationCompleted, userState); } private void OnSetMailboxAdvancedSettingsOperationCompleted(object arg) { @@ -2620,7 +2240,7 @@ namespace WebsitePanel.Providers.Exchange /// [System.Web.Services.Protocols.SoapHeaderAttribute("ServiceProviderSettingsSoapHeaderValue")] [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://smbsaas/websitepanel/server/CreateDistributionList", RequestNamespace="http://smbsaas/websitepanel/server/", ResponseNamespace="http://smbsaas/websitepanel/server/", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] - public void CreateDistributionList(string organizationId, string organizationDistinguishedName, string displayName, string accountName, string name, string domain, string managedBy) { + public void CreateDistributionList(string organizationId, string organizationDistinguishedName, string displayName, string accountName, string name, string domain, string managedBy, string[] addressLists) { this.Invoke("CreateDistributionList", new object[] { organizationId, organizationDistinguishedName, @@ -2628,11 +2248,12 @@ namespace WebsitePanel.Providers.Exchange accountName, name, domain, - managedBy}); + managedBy, + addressLists}); } /// - public System.IAsyncResult BeginCreateDistributionList(string organizationId, string organizationDistinguishedName, string displayName, string accountName, string name, string domain, string managedBy, System.AsyncCallback callback, object asyncState) { + public System.IAsyncResult BeginCreateDistributionList(string organizationId, string organizationDistinguishedName, string displayName, string accountName, string name, string domain, string managedBy, string[] addressLists, System.AsyncCallback callback, object asyncState) { return this.BeginInvoke("CreateDistributionList", new object[] { organizationId, organizationDistinguishedName, @@ -2640,7 +2261,8 @@ namespace WebsitePanel.Providers.Exchange accountName, name, domain, - managedBy}, callback, asyncState); + managedBy, + addressLists}, callback, asyncState); } /// @@ -2649,12 +2271,12 @@ namespace WebsitePanel.Providers.Exchange } /// - public void CreateDistributionListAsync(string organizationId, string organizationDistinguishedName, string displayName, string accountName, string name, string domain, string managedBy) { - this.CreateDistributionListAsync(organizationId, organizationDistinguishedName, displayName, accountName, name, domain, managedBy, null); + public void CreateDistributionListAsync(string organizationId, string organizationDistinguishedName, string displayName, string accountName, string name, string domain, string managedBy, string[] addressLists) { + this.CreateDistributionListAsync(organizationId, organizationDistinguishedName, displayName, accountName, name, domain, managedBy, addressLists, null); } /// - public void CreateDistributionListAsync(string organizationId, string organizationDistinguishedName, string displayName, string accountName, string name, string domain, string managedBy, object userState) { + public void CreateDistributionListAsync(string organizationId, string organizationDistinguishedName, string displayName, string accountName, string name, string domain, string managedBy, string[] addressLists, object userState) { if ((this.CreateDistributionListOperationCompleted == null)) { this.CreateDistributionListOperationCompleted = new System.Threading.SendOrPostCallback(this.OnCreateDistributionListOperationCompleted); } @@ -2665,7 +2287,8 @@ namespace WebsitePanel.Providers.Exchange accountName, name, domain, - managedBy}, this.CreateDistributionListOperationCompleted, userState); + managedBy, + addressLists}, this.CreateDistributionListOperationCompleted, userState); } private void OnCreateDistributionListOperationCompleted(object arg) { @@ -2760,25 +2383,27 @@ namespace WebsitePanel.Providers.Exchange /// [System.Web.Services.Protocols.SoapHeaderAttribute("ServiceProviderSettingsSoapHeaderValue")] [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://smbsaas/websitepanel/server/SetDistributionListGeneralSettings", RequestNamespace="http://smbsaas/websitepanel/server/", ResponseNamespace="http://smbsaas/websitepanel/server/", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] - public void SetDistributionListGeneralSettings(string accountName, string displayName, bool hideFromAddressBook, string managedBy, string[] members, string notes) { + public void SetDistributionListGeneralSettings(string accountName, string displayName, bool hideFromAddressBook, string managedBy, string[] members, string notes, string[] addressLists) { this.Invoke("SetDistributionListGeneralSettings", new object[] { accountName, displayName, hideFromAddressBook, managedBy, members, - notes}); + notes, + addressLists}); } /// - public System.IAsyncResult BeginSetDistributionListGeneralSettings(string accountName, string displayName, bool hideFromAddressBook, string managedBy, string[] members, string notes, System.AsyncCallback callback, object asyncState) { + public System.IAsyncResult BeginSetDistributionListGeneralSettings(string accountName, string displayName, bool hideFromAddressBook, string managedBy, string[] members, string notes, string[] addressLists, System.AsyncCallback callback, object asyncState) { return this.BeginInvoke("SetDistributionListGeneralSettings", new object[] { accountName, displayName, hideFromAddressBook, managedBy, members, - notes}, callback, asyncState); + notes, + addressLists}, callback, asyncState); } /// @@ -2787,12 +2412,12 @@ namespace WebsitePanel.Providers.Exchange } /// - public void SetDistributionListGeneralSettingsAsync(string accountName, string displayName, bool hideFromAddressBook, string managedBy, string[] members, string notes) { - this.SetDistributionListGeneralSettingsAsync(accountName, displayName, hideFromAddressBook, managedBy, members, notes, null); + public void SetDistributionListGeneralSettingsAsync(string accountName, string displayName, bool hideFromAddressBook, string managedBy, string[] members, string notes, string[] addressLists) { + this.SetDistributionListGeneralSettingsAsync(accountName, displayName, hideFromAddressBook, managedBy, members, notes, addressLists, null); } /// - public void SetDistributionListGeneralSettingsAsync(string accountName, string displayName, bool hideFromAddressBook, string managedBy, string[] members, string notes, object userState) { + public void SetDistributionListGeneralSettingsAsync(string accountName, string displayName, bool hideFromAddressBook, string managedBy, string[] members, string notes, string[] addressLists, object userState) { if ((this.SetDistributionListGeneralSettingsOperationCompleted == null)) { this.SetDistributionListGeneralSettingsOperationCompleted = new System.Threading.SendOrPostCallback(this.OnSetDistributionListGeneralSettingsOperationCompleted); } @@ -2802,7 +2427,8 @@ namespace WebsitePanel.Providers.Exchange hideFromAddressBook, managedBy, members, - notes}, this.SetDistributionListGeneralSettingsOperationCompleted, userState); + notes, + addressLists}, this.SetDistributionListGeneralSettingsOperationCompleted, userState); } private void OnSetDistributionListGeneralSettingsOperationCompleted(object arg) { @@ -2857,21 +2483,23 @@ namespace WebsitePanel.Providers.Exchange /// [System.Web.Services.Protocols.SoapHeaderAttribute("ServiceProviderSettingsSoapHeaderValue")] [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://smbsaas/websitepanel/server/SetDistributionListMailFlowSettings", RequestNamespace="http://smbsaas/websitepanel/server/", ResponseNamespace="http://smbsaas/websitepanel/server/", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] - public void SetDistributionListMailFlowSettings(string accountName, string[] acceptAccounts, string[] rejectAccounts, bool requireSenderAuthentication) { + public void SetDistributionListMailFlowSettings(string accountName, string[] acceptAccounts, string[] rejectAccounts, bool requireSenderAuthentication, string[] addressLists) { this.Invoke("SetDistributionListMailFlowSettings", new object[] { accountName, acceptAccounts, rejectAccounts, - requireSenderAuthentication}); + requireSenderAuthentication, + addressLists}); } /// - public System.IAsyncResult BeginSetDistributionListMailFlowSettings(string accountName, string[] acceptAccounts, string[] rejectAccounts, bool requireSenderAuthentication, System.AsyncCallback callback, object asyncState) { + public System.IAsyncResult BeginSetDistributionListMailFlowSettings(string accountName, string[] acceptAccounts, string[] rejectAccounts, bool requireSenderAuthentication, string[] addressLists, System.AsyncCallback callback, object asyncState) { return this.BeginInvoke("SetDistributionListMailFlowSettings", new object[] { accountName, acceptAccounts, rejectAccounts, - requireSenderAuthentication}, callback, asyncState); + requireSenderAuthentication, + addressLists}, callback, asyncState); } /// @@ -2880,12 +2508,12 @@ namespace WebsitePanel.Providers.Exchange } /// - public void SetDistributionListMailFlowSettingsAsync(string accountName, string[] acceptAccounts, string[] rejectAccounts, bool requireSenderAuthentication) { - this.SetDistributionListMailFlowSettingsAsync(accountName, acceptAccounts, rejectAccounts, requireSenderAuthentication, null); + public void SetDistributionListMailFlowSettingsAsync(string accountName, string[] acceptAccounts, string[] rejectAccounts, bool requireSenderAuthentication, string[] addressLists) { + this.SetDistributionListMailFlowSettingsAsync(accountName, acceptAccounts, rejectAccounts, requireSenderAuthentication, addressLists, null); } /// - public void SetDistributionListMailFlowSettingsAsync(string accountName, string[] acceptAccounts, string[] rejectAccounts, bool requireSenderAuthentication, object userState) { + public void SetDistributionListMailFlowSettingsAsync(string accountName, string[] acceptAccounts, string[] rejectAccounts, bool requireSenderAuthentication, string[] addressLists, object userState) { if ((this.SetDistributionListMailFlowSettingsOperationCompleted == null)) { this.SetDistributionListMailFlowSettingsOperationCompleted = new System.Threading.SendOrPostCallback(this.OnSetDistributionListMailFlowSettingsOperationCompleted); } @@ -2893,7 +2521,8 @@ namespace WebsitePanel.Providers.Exchange accountName, acceptAccounts, rejectAccounts, - requireSenderAuthentication}, this.SetDistributionListMailFlowSettingsOperationCompleted, userState); + requireSenderAuthentication, + addressLists}, this.SetDistributionListMailFlowSettingsOperationCompleted, userState); } private void OnSetDistributionListMailFlowSettingsOperationCompleted(object arg) { @@ -2948,17 +2577,19 @@ namespace WebsitePanel.Providers.Exchange /// [System.Web.Services.Protocols.SoapHeaderAttribute("ServiceProviderSettingsSoapHeaderValue")] [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://smbsaas/websitepanel/server/SetDistributionListEmailAddresses", RequestNamespace="http://smbsaas/websitepanel/server/", ResponseNamespace="http://smbsaas/websitepanel/server/", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] - public void SetDistributionListEmailAddresses(string accountName, string[] emailAddresses) { + public void SetDistributionListEmailAddresses(string accountName, string[] emailAddresses, string[] addressLists) { this.Invoke("SetDistributionListEmailAddresses", new object[] { accountName, - emailAddresses}); + emailAddresses, + addressLists}); } /// - public System.IAsyncResult BeginSetDistributionListEmailAddresses(string accountName, string[] emailAddresses, System.AsyncCallback callback, object asyncState) { + public System.IAsyncResult BeginSetDistributionListEmailAddresses(string accountName, string[] emailAddresses, string[] addressLists, System.AsyncCallback callback, object asyncState) { return this.BeginInvoke("SetDistributionListEmailAddresses", new object[] { accountName, - emailAddresses}, callback, asyncState); + emailAddresses, + addressLists}, callback, asyncState); } /// @@ -2967,18 +2598,19 @@ namespace WebsitePanel.Providers.Exchange } /// - public void SetDistributionListEmailAddressesAsync(string accountName, string[] emailAddresses) { - this.SetDistributionListEmailAddressesAsync(accountName, emailAddresses, null); + public void SetDistributionListEmailAddressesAsync(string accountName, string[] emailAddresses, string[] addressLists) { + this.SetDistributionListEmailAddressesAsync(accountName, emailAddresses, addressLists, null); } /// - public void SetDistributionListEmailAddressesAsync(string accountName, string[] emailAddresses, object userState) { + public void SetDistributionListEmailAddressesAsync(string accountName, string[] emailAddresses, string[] addressLists, object userState) { if ((this.SetDistributionListEmailAddressesOperationCompleted == null)) { this.SetDistributionListEmailAddressesOperationCompleted = new System.Threading.SendOrPostCallback(this.OnSetDistributionListEmailAddressesOperationCompleted); } this.InvokeAsync("SetDistributionListEmailAddresses", new object[] { accountName, - emailAddresses}, this.SetDistributionListEmailAddressesOperationCompleted, userState); + emailAddresses, + addressLists}, this.SetDistributionListEmailAddressesOperationCompleted, userState); } private void OnSetDistributionListEmailAddressesOperationCompleted(object arg) { @@ -2991,17 +2623,19 @@ namespace WebsitePanel.Providers.Exchange /// [System.Web.Services.Protocols.SoapHeaderAttribute("ServiceProviderSettingsSoapHeaderValue")] [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://smbsaas/websitepanel/server/SetDistributionListPrimaryEmailAddress", RequestNamespace="http://smbsaas/websitepanel/server/", ResponseNamespace="http://smbsaas/websitepanel/server/", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] - public void SetDistributionListPrimaryEmailAddress(string accountName, string emailAddress) { + public void SetDistributionListPrimaryEmailAddress(string accountName, string emailAddress, string[] addressLists) { this.Invoke("SetDistributionListPrimaryEmailAddress", new object[] { accountName, - emailAddress}); + emailAddress, + addressLists}); } /// - public System.IAsyncResult BeginSetDistributionListPrimaryEmailAddress(string accountName, string emailAddress, System.AsyncCallback callback, object asyncState) { + public System.IAsyncResult BeginSetDistributionListPrimaryEmailAddress(string accountName, string emailAddress, string[] addressLists, System.AsyncCallback callback, object asyncState) { return this.BeginInvoke("SetDistributionListPrimaryEmailAddress", new object[] { accountName, - emailAddress}, callback, asyncState); + emailAddress, + addressLists}, callback, asyncState); } /// @@ -3010,18 +2644,19 @@ namespace WebsitePanel.Providers.Exchange } /// - public void SetDistributionListPrimaryEmailAddressAsync(string accountName, string emailAddress) { - this.SetDistributionListPrimaryEmailAddressAsync(accountName, emailAddress, null); + public void SetDistributionListPrimaryEmailAddressAsync(string accountName, string emailAddress, string[] addressLists) { + this.SetDistributionListPrimaryEmailAddressAsync(accountName, emailAddress, addressLists, null); } /// - public void SetDistributionListPrimaryEmailAddressAsync(string accountName, string emailAddress, object userState) { + public void SetDistributionListPrimaryEmailAddressAsync(string accountName, string emailAddress, string[] addressLists, object userState) { if ((this.SetDistributionListPrimaryEmailAddressOperationCompleted == null)) { this.SetDistributionListPrimaryEmailAddressOperationCompleted = new System.Threading.SendOrPostCallback(this.OnSetDistributionListPrimaryEmailAddressOperationCompleted); } this.InvokeAsync("SetDistributionListPrimaryEmailAddress", new object[] { accountName, - emailAddress}, this.SetDistributionListPrimaryEmailAddressOperationCompleted, userState); + emailAddress, + addressLists}, this.SetDistributionListPrimaryEmailAddressOperationCompleted, userState); } private void OnSetDistributionListPrimaryEmailAddressOperationCompleted(object arg) { @@ -3034,21 +2669,23 @@ namespace WebsitePanel.Providers.Exchange /// [System.Web.Services.Protocols.SoapHeaderAttribute("ServiceProviderSettingsSoapHeaderValue")] [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://smbsaas/websitepanel/server/SetDistributionListPermissions", RequestNamespace="http://smbsaas/websitepanel/server/", ResponseNamespace="http://smbsaas/websitepanel/server/", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] - public void SetDistributionListPermissions(string organizationId, string accountName, string[] sendAsAccounts, string[] sendOnBehalfAccounts) { + public void SetDistributionListPermissions(string organizationId, string accountName, string[] sendAsAccounts, string[] sendOnBehalfAccounts, string[] addressLists) { this.Invoke("SetDistributionListPermissions", new object[] { organizationId, accountName, sendAsAccounts, - sendOnBehalfAccounts}); + sendOnBehalfAccounts, + addressLists}); } /// - public System.IAsyncResult BeginSetDistributionListPermissions(string organizationId, string accountName, string[] sendAsAccounts, string[] sendOnBehalfAccounts, System.AsyncCallback callback, object asyncState) { + public System.IAsyncResult BeginSetDistributionListPermissions(string organizationId, string accountName, string[] sendAsAccounts, string[] sendOnBehalfAccounts, string[] addressLists, System.AsyncCallback callback, object asyncState) { return this.BeginInvoke("SetDistributionListPermissions", new object[] { organizationId, accountName, sendAsAccounts, - sendOnBehalfAccounts}, callback, asyncState); + sendOnBehalfAccounts, + addressLists}, callback, asyncState); } /// @@ -3057,12 +2694,12 @@ namespace WebsitePanel.Providers.Exchange } /// - public void SetDistributionListPermissionsAsync(string organizationId, string accountName, string[] sendAsAccounts, string[] sendOnBehalfAccounts) { - this.SetDistributionListPermissionsAsync(organizationId, accountName, sendAsAccounts, sendOnBehalfAccounts, null); + public void SetDistributionListPermissionsAsync(string organizationId, string accountName, string[] sendAsAccounts, string[] sendOnBehalfAccounts, string[] addressLists) { + this.SetDistributionListPermissionsAsync(organizationId, accountName, sendAsAccounts, sendOnBehalfAccounts, addressLists, null); } /// - public void SetDistributionListPermissionsAsync(string organizationId, string accountName, string[] sendAsAccounts, string[] sendOnBehalfAccounts, object userState) { + public void SetDistributionListPermissionsAsync(string organizationId, string accountName, string[] sendAsAccounts, string[] sendOnBehalfAccounts, string[] addressLists, object userState) { if ((this.SetDistributionListPermissionsOperationCompleted == null)) { this.SetDistributionListPermissionsOperationCompleted = new System.Threading.SendOrPostCallback(this.OnSetDistributionListPermissionsOperationCompleted); } @@ -3070,7 +2707,8 @@ namespace WebsitePanel.Providers.Exchange organizationId, accountName, sendAsAccounts, - sendOnBehalfAccounts}, this.SetDistributionListPermissionsOperationCompleted, userState); + sendOnBehalfAccounts, + addressLists}, this.SetDistributionListPermissionsOperationCompleted, userState); } private void OnSetDistributionListPermissionsOperationCompleted(object arg) { @@ -4079,24 +3717,132 @@ namespace WebsitePanel.Providers.Exchange } } + /// + [System.Web.Services.Protocols.SoapHeaderAttribute("ServiceProviderSettingsSoapHeaderValue")] + [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://smbsaas/websitepanel/server/WipeDataFromDevice", RequestNamespace="http://smbsaas/websitepanel/server/", ResponseNamespace="http://smbsaas/websitepanel/server/", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] + public void WipeDataFromDevice(string id) { + this.Invoke("WipeDataFromDevice", new object[] { + id}); + } + + /// + public System.IAsyncResult BeginWipeDataFromDevice(string id, System.AsyncCallback callback, object asyncState) { + return this.BeginInvoke("WipeDataFromDevice", new object[] { + id}, callback, asyncState); + } + + /// + public void EndWipeDataFromDevice(System.IAsyncResult asyncResult) { + this.EndInvoke(asyncResult); + } + + /// + public void WipeDataFromDeviceAsync(string id) { + this.WipeDataFromDeviceAsync(id, null); + } + + /// + public void WipeDataFromDeviceAsync(string id, object userState) { + if ((this.WipeDataFromDeviceOperationCompleted == null)) { + this.WipeDataFromDeviceOperationCompleted = new System.Threading.SendOrPostCallback(this.OnWipeDataFromDeviceOperationCompleted); + } + this.InvokeAsync("WipeDataFromDevice", new object[] { + id}, this.WipeDataFromDeviceOperationCompleted, userState); + } + + private void OnWipeDataFromDeviceOperationCompleted(object arg) { + if ((this.WipeDataFromDeviceCompleted != null)) { + System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); + this.WipeDataFromDeviceCompleted(this, new System.ComponentModel.AsyncCompletedEventArgs(invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); + } + } + + /// + [System.Web.Services.Protocols.SoapHeaderAttribute("ServiceProviderSettingsSoapHeaderValue")] + [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://smbsaas/websitepanel/server/CancelRemoteWipeRequest", RequestNamespace="http://smbsaas/websitepanel/server/", ResponseNamespace="http://smbsaas/websitepanel/server/", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] + public void CancelRemoteWipeRequest(string id) { + this.Invoke("CancelRemoteWipeRequest", new object[] { + id}); + } + + /// + public System.IAsyncResult BeginCancelRemoteWipeRequest(string id, System.AsyncCallback callback, object asyncState) { + return this.BeginInvoke("CancelRemoteWipeRequest", new object[] { + id}, callback, asyncState); + } + + /// + public void EndCancelRemoteWipeRequest(System.IAsyncResult asyncResult) { + this.EndInvoke(asyncResult); + } + + /// + public void CancelRemoteWipeRequestAsync(string id) { + this.CancelRemoteWipeRequestAsync(id, null); + } + + /// + public void CancelRemoteWipeRequestAsync(string id, object userState) { + if ((this.CancelRemoteWipeRequestOperationCompleted == null)) { + this.CancelRemoteWipeRequestOperationCompleted = new System.Threading.SendOrPostCallback(this.OnCancelRemoteWipeRequestOperationCompleted); + } + this.InvokeAsync("CancelRemoteWipeRequest", new object[] { + id}, this.CancelRemoteWipeRequestOperationCompleted, userState); + } + + private void OnCancelRemoteWipeRequestOperationCompleted(object arg) { + if ((this.CancelRemoteWipeRequestCompleted != null)) { + System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); + this.CancelRemoteWipeRequestCompleted(this, new System.ComponentModel.AsyncCompletedEventArgs(invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); + } + } + + /// + [System.Web.Services.Protocols.SoapHeaderAttribute("ServiceProviderSettingsSoapHeaderValue")] + [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://smbsaas/websitepanel/server/RemoveDevice", RequestNamespace="http://smbsaas/websitepanel/server/", ResponseNamespace="http://smbsaas/websitepanel/server/", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] + public void RemoveDevice(string id) { + this.Invoke("RemoveDevice", new object[] { + id}); + } + + /// + public System.IAsyncResult BeginRemoveDevice(string id, System.AsyncCallback callback, object asyncState) { + return this.BeginInvoke("RemoveDevice", new object[] { + id}, callback, asyncState); + } + + /// + public void EndRemoveDevice(System.IAsyncResult asyncResult) { + this.EndInvoke(asyncResult); + } + + /// + public void RemoveDeviceAsync(string id) { + this.RemoveDeviceAsync(id, null); + } + + /// + public void RemoveDeviceAsync(string id, object userState) { + if ((this.RemoveDeviceOperationCompleted == null)) { + this.RemoveDeviceOperationCompleted = new System.Threading.SendOrPostCallback(this.OnRemoveDeviceOperationCompleted); + } + this.InvokeAsync("RemoveDevice", new object[] { + id}, this.RemoveDeviceOperationCompleted, userState); + } + + private void OnRemoveDeviceOperationCompleted(object arg) { + if ((this.RemoveDeviceCompleted != null)) { + System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); + this.RemoveDeviceCompleted(this, new System.ComponentModel.AsyncCompletedEventArgs(invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); + } + } + /// public new void CancelAsync(object userState) { base.CancelAsync(userState); } } - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] - public delegate void WipeDataFromDeviceCompletedEventHandler(object sender, System.ComponentModel.AsyncCompletedEventArgs e); - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] - public delegate void CancelRemoteWipeRequestCompletedEventHandler(object sender, System.ComponentModel.AsyncCompletedEventArgs e); - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] - public delegate void RemoveDeviceCompletedEventHandler(object sender, System.ComponentModel.AsyncCompletedEventArgs e); - /// [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] public delegate void CheckAccountCredentialsCompletedEventHandler(object sender, CheckAccountCredentialsCompletedEventArgs e); @@ -4231,6 +3977,32 @@ namespace WebsitePanel.Providers.Exchange } } + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + public delegate void CreateOrganizationAddressBookPolicyCompletedEventHandler(object sender, CreateOrganizationAddressBookPolicyCompletedEventArgs e); + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + public partial class CreateOrganizationAddressBookPolicyCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { + + private object[] results; + + internal CreateOrganizationAddressBookPolicyCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + base(exception, cancelled, userState) { + this.results = results; + } + + /// + public Organization Result { + get { + this.RaiseExceptionIfNecessary(); + return ((Organization)(this.results[0])); + } + } + } + /// [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] public delegate void DeleteOrganizationCompletedEventHandler(object sender, DeleteOrganizationCompletedEventArgs e); @@ -4321,32 +4093,6 @@ namespace WebsitePanel.Providers.Exchange [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] public delegate void DeleteAuthoritativeDomainCompletedEventHandler(object sender, System.ComponentModel.AsyncCompletedEventArgs e); - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] - public delegate void CreateMailboxCompletedEventHandler(object sender, CreateMailboxCompletedEventArgs e); - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] - [System.Diagnostics.DebuggerStepThroughAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - public partial class CreateMailboxCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { - - private object[] results; - - internal CreateMailboxCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : - base(exception, cancelled, userState) { - this.results = results; - } - - /// - public string Result { - get { - this.RaiseExceptionIfNecessary(); - return ((string)(this.results[0])); - } - } - } - /// [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] public delegate void DeleteMailboxCompletedEventHandler(object sender, System.ComponentModel.AsyncCompletedEventArgs e); @@ -5008,4 +4754,16 @@ namespace WebsitePanel.Providers.Exchange } } } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + public delegate void WipeDataFromDeviceCompletedEventHandler(object sender, System.ComponentModel.AsyncCompletedEventArgs e); + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + public delegate void CancelRemoteWipeRequestCompletedEventHandler(object sender, System.ComponentModel.AsyncCompletedEventArgs e); + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + public delegate void RemoveDeviceCompletedEventHandler(object sender, System.ComponentModel.AsyncCompletedEventArgs e); } diff --git a/WebsitePanel/Sources/WebsitePanel.Server.Client/OrganizationProxy.cs b/WebsitePanel/Sources/WebsitePanel.Server.Client/OrganizationProxy.cs index ed96ad4f..8121e66d 100644 --- a/WebsitePanel/Sources/WebsitePanel.Server.Client/OrganizationProxy.cs +++ b/WebsitePanel/Sources/WebsitePanel.Server.Client/OrganizationProxy.cs @@ -1,35 +1,7 @@ -// Copyright (c) 2012, Outercurve Foundation. -// All rights reserved. -// -// Redistribution and use in source and binary forms, with or without modification, -// are permitted provided that the following conditions are met: -// -// - Redistributions of source code must retain the above copyright notice, this -// list of conditions and the following disclaimer. -// -// - Redistributions in binary form must reproduce the above copyright notice, -// this list of conditions and the following disclaimer in the documentation -// and/or other materials provided with the distribution. -// -// - Neither the name of the Outercurve Foundation nor the names of its -// contributors may be used to endorse or promote products derived from this -// software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR -// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON -// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - //------------------------------------------------------------------------------ // // This code was generated by a tool. -// Runtime Version:2.0.50727.3053 +// Runtime Version:2.0.50727.5456 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. @@ -39,17 +11,17 @@ // // This source code was auto-generated by wsdl, Version=2.0.50727.42. // -using WebsitePanel.Providers.Common; -using WebsitePanel.Providers.ResultObjects; - namespace WebsitePanel.Providers.HostedSolution { - using System.Diagnostics; + using System.Xml.Serialization; using System.Web.Services; using System.ComponentModel; using System.Web.Services.Protocols; using System; - using System.Xml.Serialization; - + using System.Diagnostics; + + using WebsitePanel.Providers.Common; + using WebsitePanel.Providers.ResultObjects; + /// [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] @@ -72,7 +44,7 @@ namespace WebsitePanel.Providers.HostedSolution { private System.Threading.SendOrPostCallback DeleteUserOperationCompleted; - private System.Threading.SendOrPostCallback GeUserGeneralSettingsOperationCompleted; + private System.Threading.SendOrPostCallback GetUserGeneralSettingsOperationCompleted; private System.Threading.SendOrPostCallback SetUserGeneralSettingsOperationCompleted; @@ -82,9 +54,11 @@ namespace WebsitePanel.Providers.HostedSolution { private System.Threading.SendOrPostCallback GetPasswordPolicyOperationCompleted; + private System.Threading.SendOrPostCallback GetSamAccountNameByUserPrincipalNameOperationCompleted; + /// public Organizations() { - this.Url = "http://exchange-dev:9003/Organizations.asmx"; + this.Url = "http://localhost:9006/Organizations.asmx"; } /// @@ -103,7 +77,7 @@ namespace WebsitePanel.Providers.HostedSolution { public event DeleteUserCompletedEventHandler DeleteUserCompleted; /// - public event GeUserGeneralSettingsCompletedEventHandler GeUserGeneralSettingsCompleted; + public event GetUserGeneralSettingsCompletedEventHandler GetUserGeneralSettingsCompleted; /// public event SetUserGeneralSettingsCompletedEventHandler SetUserGeneralSettingsCompleted; @@ -117,6 +91,9 @@ namespace WebsitePanel.Providers.HostedSolution { /// public event GetPasswordPolicyCompletedEventHandler GetPasswordPolicyCompleted; + /// + public event GetSamAccountNameByUserPrincipalNameCompletedEventHandler GetSamAccountNameByUserPrincipalNameCompleted; + /// [System.Web.Services.Protocols.SoapHeaderAttribute("ServiceProviderSettingsSoapHeaderValue")] [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://tempuri.org/OrganizationExists", RequestNamespace="http://tempuri.org/", ResponseNamespace="http://tempuri.org/", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] @@ -244,14 +221,15 @@ namespace WebsitePanel.Providers.HostedSolution { /// [System.Web.Services.Protocols.SoapHeaderAttribute("ServiceProviderSettingsSoapHeaderValue")] [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://tempuri.org/CreateUser", RequestNamespace="http://tempuri.org/", ResponseNamespace="http://tempuri.org/", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] - public void CreateUser(string organizationId, string loginName, string displayName, string upn, string password, bool enabled) { - this.Invoke("CreateUser", new object[] { + public int CreateUser(string organizationId, string loginName, string displayName, string upn, string password, bool enabled) { + object[] results = this.Invoke("CreateUser", new object[] { organizationId, loginName, displayName, upn, password, enabled}); + return ((int)(results[0])); } /// @@ -266,8 +244,9 @@ namespace WebsitePanel.Providers.HostedSolution { } /// - public void EndCreateUser(System.IAsyncResult asyncResult) { - this.EndInvoke(asyncResult); + public int EndCreateUser(System.IAsyncResult asyncResult) { + object[] results = this.EndInvoke(asyncResult); + return ((int)(results[0])); } /// @@ -292,7 +271,7 @@ namespace WebsitePanel.Providers.HostedSolution { private void OnCreateUserOperationCompleted(object arg) { if ((this.CreateUserCompleted != null)) { System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); - this.CreateUserCompleted(this, new System.ComponentModel.AsyncCompletedEventArgs(invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); + this.CreateUserCompleted(this, new CreateUserCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); } } @@ -341,46 +320,46 @@ namespace WebsitePanel.Providers.HostedSolution { /// [System.Web.Services.Protocols.SoapHeaderAttribute("ServiceProviderSettingsSoapHeaderValue")] - [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://tempuri.org/GeUserGeneralSettings", RequestNamespace="http://tempuri.org/", ResponseNamespace="http://tempuri.org/", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] - public OrganizationUser GeUserGeneralSettings(string loginName, string organizationId) { - object[] results = this.Invoke("GeUserGeneralSettings", new object[] { + [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://tempuri.org/GetUserGeneralSettings", RequestNamespace="http://tempuri.org/", ResponseNamespace="http://tempuri.org/", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] + public OrganizationUser GetUserGeneralSettings(string loginName, string organizationId) { + object[] results = this.Invoke("GetUserGeneralSettings", new object[] { loginName, organizationId}); return ((OrganizationUser)(results[0])); } /// - public System.IAsyncResult BeginGeUserGeneralSettings(string loginName, string organizationId, System.AsyncCallback callback, object asyncState) { - return this.BeginInvoke("GeUserGeneralSettings", new object[] { + public System.IAsyncResult BeginGetUserGeneralSettings(string loginName, string organizationId, System.AsyncCallback callback, object asyncState) { + return this.BeginInvoke("GetUserGeneralSettings", new object[] { loginName, organizationId}, callback, asyncState); } /// - public OrganizationUser EndGeUserGeneralSettings(System.IAsyncResult asyncResult) { + public OrganizationUser EndGetUserGeneralSettings(System.IAsyncResult asyncResult) { object[] results = this.EndInvoke(asyncResult); return ((OrganizationUser)(results[0])); } /// - public void GeUserGeneralSettingsAsync(string loginName, string organizationId) { - this.GeUserGeneralSettingsAsync(loginName, organizationId, null); + public void GetUserGeneralSettingsAsync(string loginName, string organizationId) { + this.GetUserGeneralSettingsAsync(loginName, organizationId, null); } /// - public void GeUserGeneralSettingsAsync(string loginName, string organizationId, object userState) { - if ((this.GeUserGeneralSettingsOperationCompleted == null)) { - this.GeUserGeneralSettingsOperationCompleted = new System.Threading.SendOrPostCallback(this.OnGeUserGeneralSettingsOperationCompleted); + public void GetUserGeneralSettingsAsync(string loginName, string organizationId, object userState) { + if ((this.GetUserGeneralSettingsOperationCompleted == null)) { + this.GetUserGeneralSettingsOperationCompleted = new System.Threading.SendOrPostCallback(this.OnGetUserGeneralSettingsOperationCompleted); } - this.InvokeAsync("GeUserGeneralSettings", new object[] { + this.InvokeAsync("GetUserGeneralSettings", new object[] { loginName, - organizationId}, this.GeUserGeneralSettingsOperationCompleted, userState); + organizationId}, this.GetUserGeneralSettingsOperationCompleted, userState); } - private void OnGeUserGeneralSettingsOperationCompleted(object arg) { - if ((this.GeUserGeneralSettingsCompleted != null)) { + private void OnGetUserGeneralSettingsOperationCompleted(object arg) { + if ((this.GetUserGeneralSettingsCompleted != null)) { System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); - this.GeUserGeneralSettingsCompleted(this, new GeUserGeneralSettingsCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); + this.GetUserGeneralSettingsCompleted(this, new GetUserGeneralSettingsCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); } } @@ -745,21 +724,57 @@ namespace WebsitePanel.Providers.HostedSolution { } } + /// + [System.Web.Services.Protocols.SoapHeaderAttribute("ServiceProviderSettingsSoapHeaderValue")] + [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://tempuri.org/GetSamAccountNameByUserPrincipalName", RequestNamespace="http://tempuri.org/", ResponseNamespace="http://tempuri.org/", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] + public string GetSamAccountNameByUserPrincipalName(string organizationId, string userPrincipalName) { + object[] results = this.Invoke("GetSamAccountNameByUserPrincipalName", new object[] { + organizationId, + userPrincipalName}); + return ((string)(results[0])); + } + + /// + public System.IAsyncResult BeginGetSamAccountNameByUserPrincipalName(string organizationId, string userPrincipalName, System.AsyncCallback callback, object asyncState) { + return this.BeginInvoke("GetSamAccountNameByUserPrincipalName", new object[] { + organizationId, + userPrincipalName}, callback, asyncState); + } + + /// + public string EndGetSamAccountNameByUserPrincipalName(System.IAsyncResult asyncResult) { + object[] results = this.EndInvoke(asyncResult); + return ((string)(results[0])); + } + + /// + public void GetSamAccountNameByUserPrincipalNameAsync(string organizationId, string userPrincipalName) { + this.GetSamAccountNameByUserPrincipalNameAsync(organizationId, userPrincipalName, null); + } + + /// + public void GetSamAccountNameByUserPrincipalNameAsync(string organizationId, string userPrincipalName, object userState) { + if ((this.GetSamAccountNameByUserPrincipalNameOperationCompleted == null)) { + this.GetSamAccountNameByUserPrincipalNameOperationCompleted = new System.Threading.SendOrPostCallback(this.OnGetSamAccountNameByUserPrincipalNameOperationCompleted); + } + this.InvokeAsync("GetSamAccountNameByUserPrincipalName", new object[] { + organizationId, + userPrincipalName}, this.GetSamAccountNameByUserPrincipalNameOperationCompleted, userState); + } + + private void OnGetSamAccountNameByUserPrincipalNameOperationCompleted(object arg) { + if ((this.GetSamAccountNameByUserPrincipalNameCompleted != null)) { + System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); + this.GetSamAccountNameByUserPrincipalNameCompleted(this, new GetSamAccountNameByUserPrincipalNameCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); + } + } + /// public new void CancelAsync(object userState) { base.CancelAsync(userState); } } - - - - - - - - - /// [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] public delegate void OrganizationExistsCompletedEventHandler(object sender, OrganizationExistsCompletedEventArgs e); @@ -818,7 +833,29 @@ namespace WebsitePanel.Providers.HostedSolution { /// [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] - public delegate void CreateUserCompletedEventHandler(object sender, System.ComponentModel.AsyncCompletedEventArgs e); + public delegate void CreateUserCompletedEventHandler(object sender, CreateUserCompletedEventArgs e); + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + public partial class CreateUserCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { + + private object[] results; + + internal CreateUserCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + base(exception, cancelled, userState) { + this.results = results; + } + + /// + public int Result { + get { + this.RaiseExceptionIfNecessary(); + return ((int)(this.results[0])); + } + } + } /// [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] @@ -826,17 +863,17 @@ namespace WebsitePanel.Providers.HostedSolution { /// [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] - public delegate void GeUserGeneralSettingsCompletedEventHandler(object sender, GeUserGeneralSettingsCompletedEventArgs e); + public delegate void GetUserGeneralSettingsCompletedEventHandler(object sender, GetUserGeneralSettingsCompletedEventArgs e); /// [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] [System.Diagnostics.DebuggerStepThroughAttribute()] [System.ComponentModel.DesignerCategoryAttribute("code")] - public partial class GeUserGeneralSettingsCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { + public partial class GetUserGeneralSettingsCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { private object[] results; - internal GeUserGeneralSettingsCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + internal GetUserGeneralSettingsCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : base(exception, cancelled, userState) { this.results = results; } @@ -887,4 +924,30 @@ namespace WebsitePanel.Providers.HostedSolution { } } } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + public delegate void GetSamAccountNameByUserPrincipalNameCompletedEventHandler(object sender, GetSamAccountNameByUserPrincipalNameCompletedEventArgs e); + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + public partial class GetSamAccountNameByUserPrincipalNameCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { + + private object[] results; + + internal GetSamAccountNameByUserPrincipalNameCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + base(exception, cancelled, userState) { + this.results = results; + } + + /// + public string Result { + get { + this.RaiseExceptionIfNecessary(); + return ((string)(this.results[0])); + } + } + } } diff --git a/WebsitePanel/Sources/WebsitePanel.Server.Utils/Log.cs b/WebsitePanel/Sources/WebsitePanel.Server.Utils/Log.cs index be3ea63f..e645d9f5 100644 --- a/WebsitePanel/Sources/WebsitePanel.Server.Utils/Log.cs +++ b/WebsitePanel/Sources/WebsitePanel.Server.Utils/Log.cs @@ -1,4 +1,4 @@ -// Copyright (c) 2012, Outercurve Foundation. +// Copyright (c) 2011, Outercurve Foundation. // All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, @@ -31,125 +31,125 @@ using System.Diagnostics; namespace WebsitePanel.Server.Utils { - /// - /// Application log. - /// - public sealed class Log - { + /// + /// Application log. + /// + public sealed class Log + { private static TraceSwitch logSeverity = new TraceSwitch("Log", "General trace switch"); - - private Log() - { - } - /// - /// Write error to the log. - /// - /// Error message. - /// Exception. - public static void WriteError(string message, Exception ex) - { - try - { - if (logSeverity.TraceError) - { - string line = string.Format("[{0:G}] ERROR: {1}\n{2}\n", DateTime.Now, message, ex); - Trace.TraceError(line); - } - } - catch { } - } + private Log() + { + } - /// - /// Write error to the log. - /// - /// Exception. - public static void WriteError(Exception ex) - { + /// + /// Write error to the log. + /// + /// Error message. + /// Exception. + public static void WriteError(string message, Exception ex) + { + try + { + if (logSeverity.TraceError) + { + string line = string.Format("[{0:G}] ERROR: {1}\n{2}\n", DateTime.Now, message, ex); + Trace.TraceError(line); + } + } + catch { } + } - try - { - if (ex != null) - { - WriteError(ex.Message, ex); - } - } - catch { } - } + /// + /// Write error to the log. + /// + /// Exception. + public static void WriteError(Exception ex) + { - /// - /// Write info message to log - /// - /// - public static void WriteInfo(string message, params object[] args) - { - try - { - if (logSeverity.TraceInfo) - { - Trace.TraceInformation(FormatIncomingMessage(message, args)); - } - } - catch { } - } + try + { + if (ex != null) + { + WriteError(ex.Message, ex); + } + } + catch { } + } - /// - /// Write info message to log - /// - /// - public static void WriteWarning(string message, params object[] args) - { - try - { - if (logSeverity.TraceWarning) - { - Trace.TraceWarning(FormatIncomingMessage(message, args)); - } - } - catch { } - } + /// + /// Write info message to log + /// + /// + public static void WriteInfo(string message, params object[] args) + { + try + { + if (logSeverity.TraceInfo) + { + Trace.TraceInformation(FormatIncomingMessage(message, "INFO", args)); + } + } + catch { } + } - /// - /// Write start message to log - /// - /// + /// + /// Write info message to log + /// + /// + public static void WriteWarning(string message, params object[] args) + { + try + { + if (logSeverity.TraceWarning) + { + Trace.TraceWarning(FormatIncomingMessage(message, "WARNING", args)); + } + } + catch { } + } + + /// + /// Write start message to log + /// + /// public static void WriteStart(string message, params object[] args) - { - try - { - if (logSeverity.TraceInfo) - { - Trace.TraceInformation(FormatIncomingMessage(message, args)); - } - } - catch { } - } - - /// - /// Write end message to log - /// - /// - public static void WriteEnd(string message, params object[] args) - { - try - { - if (logSeverity.TraceInfo) - { - Trace.TraceInformation(FormatIncomingMessage(message, args)); - } - } - catch { } - } + { + try + { + if (logSeverity.TraceInfo) + { + Trace.TraceInformation(FormatIncomingMessage(message, "START", args)); + } + } + catch { } + } - private static string FormatIncomingMessage(string message, params object[] args) - { - // - if (args.Length > 0) - { - message = String.Format(message, args); - } - // - return String.Concat(String.Format("[{0:G}] END: ", DateTime.Now), message); - } - } + /// + /// Write end message to log + /// + /// + public static void WriteEnd(string message, params object[] args) + { + try + { + if (logSeverity.TraceInfo) + { + Trace.TraceInformation(FormatIncomingMessage(message, "END", args)); + } + } + catch { } + } + + private static string FormatIncomingMessage(string message, string tag, params object[] args) + { + // + if (args.Length > 0) + { + message = String.Format(message, args); + } + // + return String.Concat(String.Format("[{0:G}] {1}: ", DateTime.Now, tag), message); + } + } } diff --git a/WebsitePanel/Sources/WebsitePanel.Server/ExchangeServer.asmx.cs b/WebsitePanel/Sources/WebsitePanel.Server/ExchangeServer.asmx.cs index 04617336..c7f05931 100644 --- a/WebsitePanel/Sources/WebsitePanel.Server/ExchangeServer.asmx.cs +++ b/WebsitePanel/Sources/WebsitePanel.Server/ExchangeServer.asmx.cs @@ -68,41 +68,43 @@ namespace WebsitePanel.Server } } - #region Organizations - - [WebMethod, SoapHeader("settings")] - public Organization ExtendToExchangeOrganization(string organizationId, string securityGroup) - { - try - { - LogStart("ExtendToExchangeOrganization"); - Organization ret = ES.ExtendToExchangeOrganization(organizationId, securityGroup); - LogEnd("ExtendToExchangeOrganization"); - return ret; - } - catch (Exception ex) - { - LogError("ExtendToExchangeOrganization", ex); - throw; - } - } + #region Organizations [WebMethod, SoapHeader("settings")] - public string CreateMailEnableUser(string upn, string organizationId, string organizationDistinguishedName, ExchangeAccountType accountType, - string mailboxDatabase, string offlineAddressBook, + public Organization ExtendToExchangeOrganization(string organizationId, string securityGroup, bool IsConsumer) + { + try + { + LogStart("ExtendToExchangeOrganization"); + Organization ret = ES.ExtendToExchangeOrganization(organizationId, securityGroup, IsConsumer); + LogEnd("ExtendToExchangeOrganization"); + return ret; + } + catch (Exception ex) + { + LogError("ExtendToExchangeOrganization", ex); + throw; + } + } + + [WebMethod, SoapHeader("settings")] + public string CreateMailEnableUser(string upn, string organizationId, string organizationDistinguishedName, ExchangeAccountType accountType, + string mailboxDatabase, string offlineAddressBook, string addressBookPolicy, string accountName, bool enablePOP, bool enableIMAP, bool enableOWA, bool enableMAPI, bool enableActiveSync, - int issueWarningKB, int prohibitSendKB, int prohibitSendReceiveKB, int keepDeletedItemsDays) + int issueWarningKB, int prohibitSendKB, int prohibitSendReceiveKB, int keepDeletedItemsDays, + int maxRecipients, int maxSendMessageSizeKB, int maxReceiveMessageSizeKB, bool hideFromAddressBook, bool isConsumer) { try { LogStart("CreateMailEnableUser"); - string ret = ES.CreateMailEnableUser(upn, organizationId, organizationDistinguishedName,accountType, - mailboxDatabase, offlineAddressBook, + string ret = ES.CreateMailEnableUser(upn, organizationId, organizationDistinguishedName, accountType, + mailboxDatabase, offlineAddressBook, addressBookPolicy, accountName, enablePOP, enableIMAP, enableOWA, enableMAPI, enableActiveSync, issueWarningKB, prohibitSendKB, prohibitSendReceiveKB, - keepDeletedItemsDays); + keepDeletedItemsDays, + maxRecipients, maxSendMessageSizeKB, maxReceiveMessageSizeKB, hideFromAddressBook, isConsumer); LogEnd("CreateMailEnableUser"); return ret; } @@ -113,137 +115,155 @@ namespace WebsitePanel.Server } } - /// - /// Creates organization OAB - /// - /// - /// - /// - /// - [WebMethod, SoapHeader("settings")] - public Organization CreateOrganizationOfflineAddressBook(string organizationId, string securityGroup, string oabVirtualDir) - { - try - { - LogStart("CreateOrganizationOfflineAddressBook"); - Organization ret = ES.CreateOrganizationOfflineAddressBook(organizationId, securityGroup, oabVirtualDir); - LogEnd("CreateOrganizationOfflineAddressBook"); - return ret; - } - catch (Exception ex) - { - LogError("CreateOrganizationOfflineAddressBook", ex); - throw; - } - } + /// + /// Creates organization OAB + /// + /// + /// + /// + /// + [WebMethod, SoapHeader("settings")] + public Organization CreateOrganizationOfflineAddressBook(string organizationId, string securityGroup, string oabVirtualDir) + { + try + { + LogStart("CreateOrganizationOfflineAddressBook"); + Organization ret = ES.CreateOrganizationOfflineAddressBook(organizationId, securityGroup, oabVirtualDir); + LogEnd("CreateOrganizationOfflineAddressBook"); + return ret; + } + catch (Exception ex) + { + LogError("CreateOrganizationOfflineAddressBook", ex); + throw; + } + } - /// - /// Updates organization OAB - /// - /// - [WebMethod, SoapHeader("settings")] - public void UpdateOrganizationOfflineAddressBook(string id) - { - try - { - LogStart("UpdateOrganizationOfflineAddressBook"); - ES.UpdateOrganizationOfflineAddressBook(id); - LogEnd("UpdateOrganizationOfflineAddressBook"); - } - catch (Exception ex) - { - LogError("UpdateOrganizationOfflineAddressBook", ex); - throw; - } - } + /// + /// Updates organization OAB + /// + /// + [WebMethod, SoapHeader("settings")] + public void UpdateOrganizationOfflineAddressBook(string id) + { + try + { + LogStart("UpdateOrganizationOfflineAddressBook"); + ES.UpdateOrganizationOfflineAddressBook(id); + LogEnd("UpdateOrganizationOfflineAddressBook"); + } + catch (Exception ex) + { + LogError("UpdateOrganizationOfflineAddressBook", ex); + throw; + } + } - [WebMethod, SoapHeader("settings")] - public string GetOABVirtualDirectory() - { - try - { - LogStart("GetOABVirtualDirectory"); - string ret = ES.GetOABVirtualDirectory(); - LogEnd("GetOABVirtualDirectory"); - return ret; - } - catch (Exception ex) - { - LogError("GetOABVirtualDirectory", ex); - throw; - } - } + [WebMethod, SoapHeader("settings")] + public string GetOABVirtualDirectory() + { + try + { + LogStart("GetOABVirtualDirectory"); + string ret = ES.GetOABVirtualDirectory(); + LogEnd("GetOABVirtualDirectory"); + return ret; + } + catch (Exception ex) + { + LogError("GetOABVirtualDirectory", ex); + throw; + } + } - [WebMethod, SoapHeader("settings")] - public bool DeleteOrganization(string organizationId, string distinguishedName, string globalAddressList, string addressList, string roomsAddressList, string offlineAddressBook, string securityGroup) - { - try - { - LogStart("DeleteOrganization"); - bool ret = ES.DeleteOrganization(organizationId, distinguishedName, globalAddressList, addressList, roomsAddressList, offlineAddressBook, securityGroup); - LogEnd("DeleteOrganization"); - return ret; - } - catch (Exception ex) - { - LogError("DeleteOrganization", ex); - throw; - } - } + [WebMethod, SoapHeader("settings")] + public Organization CreateOrganizationAddressBookPolicy(string organizationId, string gal, string addressBook, string roomList, string oab) + { + try + { + LogStart("CCreateOrganizationAddressBookPolicy"); + Organization ret = ES.CreateOrganizationAddressBookPolicy(organizationId, gal, addressBook, roomList, oab); + LogEnd("CreateOrganizationAddressBookPolicy"); + return ret; + } + catch (Exception ex) + { + LogError("CreateOrganizationAddressBookPolicy", ex); + throw; + } + } + + + [WebMethod, SoapHeader("settings")] + public bool DeleteOrganization(string organizationId, string distinguishedName, string globalAddressList, string addressList, string roomList, string offlineAddressBook, string securityGroup, string addressBookPolicy) + { + try + { + LogStart("DeleteOrganization"); + bool ret = ES.DeleteOrganization(organizationId, distinguishedName, globalAddressList, addressList, roomList, offlineAddressBook, securityGroup, addressBookPolicy); + LogEnd("DeleteOrganization"); + return ret; + } + catch (Exception ex) + { + LogError("DeleteOrganization", ex); + throw; + } + } - [WebMethod, SoapHeader("settings")] - public void SetOrganizationStorageLimits(string organizationDistinguishedName, int issueWarningKB, int prohibitSendKB, int prohibitSendReceiveKB, int keepDeletedItemsDays) - { - try - { - LogStart("SetOrganizationStorageLimits"); - ES.SetOrganizationStorageLimits(organizationDistinguishedName, issueWarningKB, prohibitSendKB, prohibitSendReceiveKB, keepDeletedItemsDays); - LogEnd("SetOrganizationStorageLimits"); - } - catch (Exception ex) - { - LogError("SetOrganizationStorageLimits", ex); - throw; - } - } + [WebMethod, SoapHeader("settings")] + public void SetOrganizationStorageLimits(string organizationDistinguishedName, int issueWarningKB, int prohibitSendKB, int prohibitSendReceiveKB, int keepDeletedItemsDays) + { + try + { + LogStart("SetOrganizationStorageLimits"); + ES.SetOrganizationStorageLimits(organizationDistinguishedName, issueWarningKB, prohibitSendKB, prohibitSendReceiveKB, keepDeletedItemsDays); + LogEnd("SetOrganizationStorageLimits"); + } + catch (Exception ex) + { + LogError("SetOrganizationStorageLimits", ex); + throw; + } + } - [WebMethod, SoapHeader("settings")] - public ExchangeItemStatistics[] GetMailboxesStatistics(string organizationDistinguishedName) - { - try - { - LogStart("GetMailboxesStatistics"); - ExchangeItemStatistics[] ret = ES.GetMailboxesStatistics(organizationDistinguishedName); - LogEnd("GetMailboxesStatistics"); - return ret; - } - catch (Exception ex) - { - LogError("GetMailboxesStatistics", ex); - throw; - } - } - #endregion + [WebMethod, SoapHeader("settings")] + public ExchangeItemStatistics[] GetMailboxesStatistics(string organizationDistinguishedName) + { + try + { + LogStart("GetMailboxesStatistics"); + ExchangeItemStatistics[] ret = ES.GetMailboxesStatistics(organizationDistinguishedName); + LogEnd("GetMailboxesStatistics"); + return ret; + } + catch (Exception ex) + { + LogError("GetMailboxesStatistics", ex); + throw; + } + } + #endregion - #region Domains - [WebMethod, SoapHeader("settings")] + #region Domains + [WebMethod, SoapHeader("settings")] public void AddAuthoritativeDomain(string domain) - { - try - { + { + try + { LogStart("AddAuthoritativeDomain"); ES.AddAuthoritativeDomain(domain); LogEnd("AddAuthoritativeDomain"); - } - catch (Exception ex) - { + } + catch (Exception ex) + { LogError("AddAuthoritativeDomain", ex); - throw; - } - } + throw; + } + } [WebMethod, SoapHeader("settings")] @@ -252,7 +272,7 @@ namespace WebsitePanel.Server try { LogStart("GetAuthoritativeDomains"); - string []ret = ES.GetAuthoritativeDomains(); + string[] ret = ES.GetAuthoritativeDomains(); LogEnd("GetAuthoritativeDomains"); return ret; } @@ -263,39 +283,41 @@ namespace WebsitePanel.Server } } - [WebMethod, SoapHeader("settings")] + [WebMethod, SoapHeader("settings")] public void DeleteAuthoritativeDomain(string domain) - { - try - { + { + try + { LogStart("DeleteAuthoritativeDomain"); ES.DeleteAuthoritativeDomain(domain); LogEnd("DeleteAuthoritativeDomain"); - } - catch (Exception ex) - { + } + catch (Exception ex) + { LogError("DeleteAuthoritativeDomain", ex); - throw; - } - } - #endregion + throw; + } + } + #endregion - #region Mailboxes + #region Mailboxes + /* [WebMethod, SoapHeader("settings")] public string CreateMailbox(string organizationId, string organizationDistinguishedName, string mailboxDatabase, - string securityGroup, string offlineAddressBook, ExchangeAccountType accountType, + string securityGroup, string offlineAddressBook, string addressBookPolicy, ExchangeAccountType accountType, string displayName, string accountName, string name, string domain, string password, bool enablePOP, bool enableIMAP, bool enableOWA, bool enableMAPI, bool enableActiveSync, - int issueWarningKB, int prohibitSendKB, int prohibitSendReceiveKB, int keepDeletedItemsDays) + int issueWarningKB, int prohibitSendKB, int prohibitSendReceiveKB, int keepDeletedItemsDays, int maxRecipients, int maxSendMessageSizeKB, int maxReceiveMessageSizeKB, bool hideFromAddressBook) { try { LogStart("CreateMailbox"); string ret = ES.CreateMailbox(organizationId, organizationDistinguishedName, mailboxDatabase, securityGroup, - offlineAddressBook, accountType, + offlineAddressBook, addressBookPolicy, accountType, displayName, accountName, name, domain, password, enablePOP, enableIMAP, enableOWA, enableMAPI, enableActiveSync, - issueWarningKB, prohibitSendKB, prohibitSendReceiveKB, keepDeletedItemsDays); + issueWarningKB, prohibitSendKB, prohibitSendReceiveKB, keepDeletedItemsDays, + maxRecipients, maxSendMessageSizeKB, maxReceiveMessageSizeKB, hideFromAddressBook); LogEnd("CreateMailbox"); return ret; } @@ -305,22 +327,22 @@ namespace WebsitePanel.Server throw; } } - - [WebMethod, SoapHeader("settings")] - public void DeleteMailbox(string accountName) - { - try - { - LogStart("DeleteMailbox"); - ES.DeleteMailbox(accountName); - LogEnd("DeleteMailbox"); - } - catch (Exception ex) - { - LogError("DeleteMailbox", ex); - throw; - } - } +*/ + [WebMethod, SoapHeader("settings")] + public void DeleteMailbox(string accountName) + { + try + { + LogStart("DeleteMailbox"); + ES.DeleteMailbox(accountName); + LogEnd("DeleteMailbox"); + } + catch (Exception ex) + { + LogError("DeleteMailbox", ex); + throw; + } + } [WebMethod, SoapHeader("settings")] @@ -339,164 +361,164 @@ namespace WebsitePanel.Server } } - [WebMethod, SoapHeader("settings")] - public ExchangeMailbox GetMailboxGeneralSettings(string accountName) - { - try - { - LogStart("GetMailboxGeneralSettings"); - ExchangeMailbox ret = ES.GetMailboxGeneralSettings(accountName); - LogEnd("GetMailboxGeneralSettings"); - return ret; - } - catch (Exception ex) - { - LogError("GetMailboxGeneralSettings", ex); - throw; - } - } + [WebMethod, SoapHeader("settings")] + public ExchangeMailbox GetMailboxGeneralSettings(string accountName) + { + try + { + LogStart("GetMailboxGeneralSettings"); + ExchangeMailbox ret = ES.GetMailboxGeneralSettings(accountName); + LogEnd("GetMailboxGeneralSettings"); + return ret; + } + catch (Exception ex) + { + LogError("GetMailboxGeneralSettings", ex); + throw; + } + } - [WebMethod, SoapHeader("settings")] - public void SetMailboxGeneralSettings(string accountName, string displayName, string password, bool hideFromAddressBook, bool disabled, string firstName, string initials, string lastName, string address, string city, string state, string zip, string country, string jobTitle, string company, string department, string office, string managerAccountName, string businessPhone, string fax, string homePhone, string mobilePhone, string pager, string webPage, string notes) - { - try - { - LogStart("SetMailboxGeneralSettings"); - ES.SetMailboxGeneralSettings(accountName, displayName, password, hideFromAddressBook, disabled, firstName, initials, lastName, address, city, state, zip, country, jobTitle, company, department, office, managerAccountName, businessPhone, fax, homePhone, mobilePhone, pager, webPage, notes); - LogEnd("SetMailboxGeneralSettings"); - } - catch (Exception ex) - { - LogError("SetMailboxGeneralSettings", ex); - throw; - } - } + [WebMethod, SoapHeader("settings")] + public void SetMailboxGeneralSettings(string accountName, bool hideFromAddressBook, bool disabled) + { + try + { + LogStart("SetMailboxGeneralSettings"); + ES.SetMailboxGeneralSettings(accountName, hideFromAddressBook, disabled); + LogEnd("SetMailboxGeneralSettings"); + } + catch (Exception ex) + { + LogError("SetMailboxGeneralSettings", ex); + throw; + } + } - [WebMethod, SoapHeader("settings")] - public ExchangeMailbox GetMailboxMailFlowSettings(string accountName) - { - try - { - LogStart("GetMailboxMailFlowSettings"); - ExchangeMailbox ret = ES.GetMailboxMailFlowSettings(accountName); - LogEnd("GetMailboxMailFlowSettings"); - return ret; - } - catch (Exception ex) - { - LogError("GetMailboxMailFlowSettings", ex); - throw; - } - } + [WebMethod, SoapHeader("settings")] + public ExchangeMailbox GetMailboxMailFlowSettings(string accountName) + { + try + { + LogStart("GetMailboxMailFlowSettings"); + ExchangeMailbox ret = ES.GetMailboxMailFlowSettings(accountName); + LogEnd("GetMailboxMailFlowSettings"); + return ret; + } + catch (Exception ex) + { + LogError("GetMailboxMailFlowSettings", ex); + throw; + } + } - [WebMethod, SoapHeader("settings")] - public void SetMailboxMailFlowSettings(string accountName, bool enableForwarding, string forwardingAccountName, bool forwardToBoth, string[] sendOnBehalfAccounts, string[] acceptAccounts, string[] rejectAccounts, int maxRecipients, int maxSendMessageSizeKB, int maxReceiveMessageSizeKB, bool requireSenderAuthentication) - { - try - { - LogStart("SetMailboxMailFlowSettings"); - ES.SetMailboxMailFlowSettings(accountName, enableForwarding, forwardingAccountName, forwardToBoth, sendOnBehalfAccounts, acceptAccounts, rejectAccounts, maxRecipients, maxSendMessageSizeKB, maxReceiveMessageSizeKB, requireSenderAuthentication); - LogEnd("SetMailboxMailFlowSettings"); - } - catch (Exception ex) - { - LogError("SetMailboxMailFlowSettings", ex); - throw; - } - } + [WebMethod, SoapHeader("settings")] + public void SetMailboxMailFlowSettings(string accountName, bool enableForwarding, string forwardingAccountName, bool forwardToBoth, string[] sendOnBehalfAccounts, string[] acceptAccounts, string[] rejectAccounts, bool requireSenderAuthentication) + { + try + { + LogStart("SetMailboxMailFlowSettings"); + ES.SetMailboxMailFlowSettings(accountName, enableForwarding, forwardingAccountName, forwardToBoth, sendOnBehalfAccounts, acceptAccounts, rejectAccounts, requireSenderAuthentication); + LogEnd("SetMailboxMailFlowSettings"); + } + catch (Exception ex) + { + LogError("SetMailboxMailFlowSettings", ex); + throw; + } + } - [WebMethod, SoapHeader("settings")] - public ExchangeMailbox GetMailboxAdvancedSettings(string accountName) - { - try - { - LogStart("GetMailboxAdvancedSettings"); - ExchangeMailbox ret = ES.GetMailboxAdvancedSettings(accountName); - LogEnd("GetMailboxAdvancedSettings"); - return ret; - } - catch (Exception ex) - { - LogError("GetMailboxAdvancedSettings", ex); - throw; - } - } + [WebMethod, SoapHeader("settings")] + public ExchangeMailbox GetMailboxAdvancedSettings(string accountName) + { + try + { + LogStart("GetMailboxAdvancedSettings"); + ExchangeMailbox ret = ES.GetMailboxAdvancedSettings(accountName); + LogEnd("GetMailboxAdvancedSettings"); + return ret; + } + catch (Exception ex) + { + LogError("GetMailboxAdvancedSettings", ex); + throw; + } + } - [WebMethod, SoapHeader("settings")] - public void SetMailboxAdvancedSettings(string organizationId, string accountName, bool enablePOP, bool enableIMAP, bool enableOWA, bool enableMAPI, bool enableActiveSync, - int issueWarningKB, int prohibitSendKB, int prohibitSendReceiveKB, int keepDeletedItemsDays) - { - try - { - LogStart("SetMailboxAdvancedSettings"); - ES.SetMailboxAdvancedSettings(organizationId, accountName, enablePOP, enableIMAP, enableOWA, enableMAPI, enableActiveSync, - issueWarningKB, prohibitSendKB, prohibitSendReceiveKB, keepDeletedItemsDays); - LogEnd("SetMailboxAdvancedSettings"); - } - catch (Exception ex) - { - LogError("SetMailboxAdvancedSettings", ex); - throw; - } - } + [WebMethod, SoapHeader("settings")] + public void SetMailboxAdvancedSettings(string organizationId, string accountName, bool enablePOP, bool enableIMAP, bool enableOWA, bool enableMAPI, bool enableActiveSync, + int issueWarningKB, int prohibitSendKB, int prohibitSendReceiveKB, int keepDeletedItemsDays, int maxRecipients, int maxSendMessageSizeKB, int maxReceiveMessageSizeKB) + { + try + { + LogStart("SetMailboxAdvancedSettings"); + ES.SetMailboxAdvancedSettings(organizationId, accountName, enablePOP, enableIMAP, enableOWA, enableMAPI, enableActiveSync, + issueWarningKB, prohibitSendKB, prohibitSendReceiveKB, keepDeletedItemsDays, maxRecipients, maxSendMessageSizeKB, maxReceiveMessageSizeKB); + LogEnd("SetMailboxAdvancedSettings"); + } + catch (Exception ex) + { + LogError("SetMailboxAdvancedSettings", ex); + throw; + } + } - [WebMethod, SoapHeader("settings")] - public ExchangeEmailAddress[] GetMailboxEmailAddresses(string accountName) - { - try - { - LogStart("GetMailboxEmailAddresses"); - ExchangeEmailAddress[] ret = ES.GetMailboxEmailAddresses(accountName); - LogEnd("GetMailboxEmailAddresses"); - return ret; - } - catch (Exception ex) - { - LogError("GetMailboxEmailAddresses", ex); - throw; - } - } + [WebMethod, SoapHeader("settings")] + public ExchangeEmailAddress[] GetMailboxEmailAddresses(string accountName) + { + try + { + LogStart("GetMailboxEmailAddresses"); + ExchangeEmailAddress[] ret = ES.GetMailboxEmailAddresses(accountName); + LogEnd("GetMailboxEmailAddresses"); + return ret; + } + catch (Exception ex) + { + LogError("GetMailboxEmailAddresses", ex); + throw; + } + } - [WebMethod, SoapHeader("settings")] - public void SetMailboxEmailAddresses(string accountName, string[] emailAddresses) - { - try - { - LogStart("SetMailboxEmailAddresses"); - ES.SetMailboxEmailAddresses(accountName, emailAddresses); - LogEnd("SetMailboxEmailAddresses"); - } - catch (Exception ex) - { - LogError("SetMailboxEmailAddresses", ex); - throw; - } - } + [WebMethod, SoapHeader("settings")] + public void SetMailboxEmailAddresses(string accountName, string[] emailAddresses) + { + try + { + LogStart("SetMailboxEmailAddresses"); + ES.SetMailboxEmailAddresses(accountName, emailAddresses); + LogEnd("SetMailboxEmailAddresses"); + } + catch (Exception ex) + { + LogError("SetMailboxEmailAddresses", ex); + throw; + } + } - [WebMethod, SoapHeader("settings")] - public void SetMailboxPrimaryEmailAddress(string accountName, string emailAddress) - { - try - { - LogStart("SetMailboxPrimaryEmailAddress"); - ES.SetMailboxPrimaryEmailAddress(accountName, emailAddress); - LogEnd("SetMailboxPrimaryEmailAddress"); - } - catch (Exception ex) - { - LogError("SetMailboxPrimaryEmailAddress", ex); - throw; - } - } + [WebMethod, SoapHeader("settings")] + public void SetMailboxPrimaryEmailAddress(string accountName, string emailAddress) + { + try + { + LogStart("SetMailboxPrimaryEmailAddress"); + ES.SetMailboxPrimaryEmailAddress(accountName, emailAddress); + LogEnd("SetMailboxPrimaryEmailAddress"); + } + catch (Exception ex) + { + LogError("SetMailboxPrimaryEmailAddress", ex); + throw; + } + } [WebMethod, SoapHeader("settings")] - public void SetMailboxPermissions(string organizationId, string accountName, string[] sendAsAccounts, string[] fullAccessAccounts) + public void SetMailboxPermissions(string organizationId, string accountName, string[] sendAsAccounts, string[] fullAccessAccounts) { try { LogStart("SetMailboxPermissions"); - ES.SetMailboxPermissions(organizationId, accountName, sendAsAccounts, fullAccessAccounts); + ES.SetMailboxPermissions(organizationId, accountName, sendAsAccounts, fullAccessAccounts); LogEnd("SetMailboxPermissions"); } catch (Exception ex) @@ -505,16 +527,16 @@ namespace WebsitePanel.Server throw; } } - - + + [WebMethod, SoapHeader("settings")] - public ExchangeMailbox GetMailboxPermissions(string organizationId, string accountName) + public ExchangeMailbox GetMailboxPermissions(string organizationId, string accountName) { try { LogStart("GetMailboxPermissions"); - ExchangeMailbox ret = ES.GetMailboxPermissions(organizationId, accountName); + ExchangeMailbox ret = ES.GetMailboxPermissions(organizationId, accountName); LogEnd("GetMailboxPermissions"); return ret; } @@ -525,285 +547,285 @@ namespace WebsitePanel.Server } } - [WebMethod, SoapHeader("settings")] - public ExchangeMailboxStatistics GetMailboxStatistics(string accountName) - { - try - { - LogStart("GetMailboxStatistics"); - ExchangeMailboxStatistics ret = ES.GetMailboxStatistics(accountName); - LogEnd("GetMailboxStatistics"); - return ret; - } - catch (Exception ex) - { - Log.WriteError("GetMailboxStatistics", ex); - throw; - } - } + [WebMethod, SoapHeader("settings")] + public ExchangeMailboxStatistics GetMailboxStatistics(string accountName) + { + try + { + LogStart("GetMailboxStatistics"); + ExchangeMailboxStatistics ret = ES.GetMailboxStatistics(accountName); + LogEnd("GetMailboxStatistics"); + return ret; + } + catch (Exception ex) + { + Log.WriteError("GetMailboxStatistics", ex); + throw; + } + } #endregion - #region Contacts - [WebMethod, SoapHeader("settings")] + #region Contacts + [WebMethod, SoapHeader("settings")] public void CreateContact(string organizationId, string organizationDistinguishedName, string contactDisplayName, string contactAccountName, string contactEmail, string defaultOrganizationDomain) - { - try - { - LogStart("CreateContact"); + { + try + { + LogStart("CreateContact"); ES.CreateContact(organizationId, organizationDistinguishedName, contactDisplayName, contactAccountName, contactEmail, defaultOrganizationDomain); - LogEnd("CreateContact"); - } - catch (Exception ex) - { - LogError("CreateContact", ex); - throw; - } - } - - [WebMethod, SoapHeader("settings")] - public void DeleteContact(string accountName) - { - try - { - LogStart("DeleteContact"); - ES.DeleteContact(accountName); - LogEnd("DeleteContact"); - } - catch (Exception ex) - { - LogError("DeleteContact", ex); - throw; - } - } - - [WebMethod, SoapHeader("settings")] - public ExchangeContact GetContactGeneralSettings(string accountName) - { - try - { - LogStart("GetContactGeneralSettings"); - ExchangeContact ret = ES.GetContactGeneralSettings(accountName); - LogEnd("GetContactGeneralSettings"); - return ret; - } - catch (Exception ex) - { - LogError("GetContactGeneralSettings", ex); - throw; - } - } - - [WebMethod, SoapHeader("settings")] - public void SetContactGeneralSettings(string accountName, string displayName, string email, bool hideFromAddressBook, string firstName, string initials, string lastName, string address, string city, string state, string zip, string country, string jobTitle, string company, string department, string office, string managerAccountName, string businessPhone, string fax, string homePhone, string mobilePhone, string pager, string webPage, string notes, int useMapiRichTextFormat, string defaultDomain) - { - try - { - LogStart("SetContactGeneralSettings"); - ES.SetContactGeneralSettings(accountName, displayName, email, hideFromAddressBook, firstName, initials, lastName, address, city, state, zip, country, jobTitle, company, department, office, managerAccountName, businessPhone, fax, homePhone, mobilePhone, pager, webPage, notes, useMapiRichTextFormat, defaultDomain); - LogEnd("SetContactGeneralSettings"); - } - catch (Exception ex) - { - LogError("SetContactGeneralSettings", ex); - throw; - } - } - - [WebMethod, SoapHeader("settings")] - public ExchangeContact GetContactMailFlowSettings(string accountName) - { - try - { - LogStart("GetContactMailFlowSettings"); - ExchangeContact ret = ES.GetContactMailFlowSettings(accountName); - LogEnd("GetContactMailFlowSettings"); - return ret; - } - catch (Exception ex) - { - LogError("GetContactMailFlowSettings", ex); - throw; - } - } - - [WebMethod, SoapHeader("settings")] - public void SetContactMailFlowSettings(string accountName, string[] acceptAccounts, string[] rejectAccounts, bool requireSenderAuthentication) - { - try - { - LogStart("SetContactMailFlowSettings"); - ES.SetContactMailFlowSettings(accountName, acceptAccounts, rejectAccounts, requireSenderAuthentication); - LogEnd("SetContactMailFlowSettings"); - } - catch (Exception ex) - { - LogError("SetContactMailFlowSettings", ex); - throw; - } - } - #endregion - - #region Distribution Lists - [WebMethod, SoapHeader("settings")] - public void CreateDistributionList(string organizationId, string organizationDistinguishedName, string displayName, string accountName, string name, string domain, string managedBy) - { - try - { - LogStart("CreateDistributionList"); - ES.CreateDistributionList(organizationId, organizationDistinguishedName, displayName, accountName, name, domain, managedBy); - LogEnd("CreateDistributionList"); - } - catch (Exception ex) - { - LogError("CreateDistributionList", ex); - throw; - } - } - - [WebMethod, SoapHeader("settings")] - public void DeleteDistributionList(string accountName) - { - try - { - LogStart("DeleteDistributionList"); - ES.DeleteDistributionList(accountName); - LogEnd("DeleteDistributionList"); - } - catch (Exception ex) - { - LogError("DeleteDistributionList", ex); - throw; - } - } - - [WebMethod, SoapHeader("settings")] - public ExchangeDistributionList GetDistributionListGeneralSettings(string accountName) - { - try - { - LogStart("GetDistributionListGeneralSettings"); - ExchangeDistributionList ret = ES.GetDistributionListGeneralSettings(accountName); - LogEnd("GetDistributionListGeneralSettings"); - return ret; - } - catch (Exception ex) - { - LogError("GetDistributionListGeneralSettings", ex); - throw; - } - } - - [WebMethod, SoapHeader("settings")] - public void SetDistributionListGeneralSettings(string accountName, string displayName, bool hideFromAddressBook, string managedBy, string[] members, string notes) - { - try - { - LogStart("SetDistributionListGeneralSettings"); - ES.SetDistributionListGeneralSettings(accountName, displayName, hideFromAddressBook, managedBy, members, notes); - LogEnd("SetDistributionListGeneralSettings"); - } - catch (Exception ex) - { - LogError("SetDistributionListGeneralSettings", ex); - throw; - } - } - - [WebMethod, SoapHeader("settings")] - public ExchangeDistributionList GetDistributionListMailFlowSettings(string accountName) - { - try - { - LogStart("GetDistributionListMailFlowSettings"); - ExchangeDistributionList ret = ES.GetDistributionListMailFlowSettings(accountName); - LogEnd("GetDistributionListMailFlowSettings"); - return ret; - } - catch (Exception ex) - { - LogError("GetDistributionListMailFlowSettings", ex); - throw; - } - } - - [WebMethod, SoapHeader("settings")] - public void SetDistributionListMailFlowSettings(string accountName, string[] acceptAccounts, string[] rejectAccounts, bool requireSenderAuthentication) - { - try - { - LogStart("SetDistributionListMailFlowSettings"); - ES.SetDistributionListMailFlowSettings(accountName, acceptAccounts, rejectAccounts, requireSenderAuthentication); - LogEnd("SetDistributionListMailFlowSettings"); - } - catch (Exception ex) - { - LogError("SetDistributionListMailFlowSettings", ex); - throw; - } - } - - [WebMethod, SoapHeader("settings")] - public ExchangeEmailAddress[] GetDistributionListEmailAddresses(string accountName) - { - try - { - LogStart("GetDistributionListEmailAddresses"); - ExchangeEmailAddress[] ret = ES.GetDistributionListEmailAddresses(accountName); - LogEnd("GetDistributionListEmailAddresses"); - return ret; - } - catch (Exception ex) - { - LogError("GetDistributionListEmailAddresses", ex); - throw; - } - } - - [WebMethod, SoapHeader("settings")] - public void SetDistributionListEmailAddresses(string accountName, string[] emailAddresses) - { - try - { - LogStart("SetDistributionListEmailAddresses"); - ES.SetDistributionListEmailAddresses(accountName, emailAddresses); - LogEnd("SetDistributionListEmailAddresses"); - } - catch (Exception ex) - { - LogError("SetDistributionListEmailAddresses", ex); - throw; - } - } - - [WebMethod, SoapHeader("settings")] - public void SetDistributionListPrimaryEmailAddress(string accountName, string emailAddress) - { - try - { - LogStart("SetDistributionListPrimaryEmailAddress"); - ES.SetDistributionListPrimaryEmailAddress(accountName, emailAddress); - LogEnd("SetDistributionListPrimaryEmailAddress"); - } - catch (Exception ex) - { - LogError("SetDistributionListPrimaryEmailAddress", ex); - throw; - } - } + LogEnd("CreateContact"); + } + catch (Exception ex) + { + LogError("CreateContact", ex); + throw; + } + } [WebMethod, SoapHeader("settings")] - public void SetDistributionListPermissions(string organizationId, string accountName, string[] sendAsAccounts, string[] sendOnBehalfAccounts) + public void DeleteContact(string accountName) { - ES.SetDistributionListPermissions(organizationId, accountName, sendAsAccounts, sendOnBehalfAccounts); + try + { + LogStart("DeleteContact"); + ES.DeleteContact(accountName); + LogEnd("DeleteContact"); + } + catch (Exception ex) + { + LogError("DeleteContact", ex); + throw; + } } - + + [WebMethod, SoapHeader("settings")] + public ExchangeContact GetContactGeneralSettings(string accountName) + { + try + { + LogStart("GetContactGeneralSettings"); + ExchangeContact ret = ES.GetContactGeneralSettings(accountName); + LogEnd("GetContactGeneralSettings"); + return ret; + } + catch (Exception ex) + { + LogError("GetContactGeneralSettings", ex); + throw; + } + } + + [WebMethod, SoapHeader("settings")] + public void SetContactGeneralSettings(string accountName, string displayName, string email, bool hideFromAddressBook, string firstName, string initials, string lastName, string address, string city, string state, string zip, string country, string jobTitle, string company, string department, string office, string managerAccountName, string businessPhone, string fax, string homePhone, string mobilePhone, string pager, string webPage, string notes, int useMapiRichTextFormat, string defaultDomain) + { + try + { + LogStart("SetContactGeneralSettings"); + ES.SetContactGeneralSettings(accountName, displayName, email, hideFromAddressBook, firstName, initials, lastName, address, city, state, zip, country, jobTitle, company, department, office, managerAccountName, businessPhone, fax, homePhone, mobilePhone, pager, webPage, notes, useMapiRichTextFormat, defaultDomain); + LogEnd("SetContactGeneralSettings"); + } + catch (Exception ex) + { + LogError("SetContactGeneralSettings", ex); + throw; + } + } + + [WebMethod, SoapHeader("settings")] + public ExchangeContact GetContactMailFlowSettings(string accountName) + { + try + { + LogStart("GetContactMailFlowSettings"); + ExchangeContact ret = ES.GetContactMailFlowSettings(accountName); + LogEnd("GetContactMailFlowSettings"); + return ret; + } + catch (Exception ex) + { + LogError("GetContactMailFlowSettings", ex); + throw; + } + } + + [WebMethod, SoapHeader("settings")] + public void SetContactMailFlowSettings(string accountName, string[] acceptAccounts, string[] rejectAccounts, bool requireSenderAuthentication) + { + try + { + LogStart("SetContactMailFlowSettings"); + ES.SetContactMailFlowSettings(accountName, acceptAccounts, rejectAccounts, requireSenderAuthentication); + LogEnd("SetContactMailFlowSettings"); + } + catch (Exception ex) + { + LogError("SetContactMailFlowSettings", ex); + throw; + } + } + #endregion + + #region Distribution Lists + [WebMethod, SoapHeader("settings")] + public void CreateDistributionList(string organizationId, string organizationDistinguishedName, string displayName, string accountName, string name, string domain, string managedBy, string[] addressLists) + { + try + { + LogStart("CreateDistributionList"); + ES.CreateDistributionList(organizationId, organizationDistinguishedName, displayName, accountName, name, domain, managedBy, addressLists); + LogEnd("CreateDistributionList"); + } + catch (Exception ex) + { + LogError("CreateDistributionList", ex); + throw; + } + } + + [WebMethod, SoapHeader("settings")] + public void DeleteDistributionList(string accountName) + { + try + { + LogStart("DeleteDistributionList"); + ES.DeleteDistributionList(accountName); + LogEnd("DeleteDistributionList"); + } + catch (Exception ex) + { + LogError("DeleteDistributionList", ex); + throw; + } + } + + [WebMethod, SoapHeader("settings")] + public ExchangeDistributionList GetDistributionListGeneralSettings(string accountName) + { + try + { + LogStart("GetDistributionListGeneralSettings"); + ExchangeDistributionList ret = ES.GetDistributionListGeneralSettings(accountName); + LogEnd("GetDistributionListGeneralSettings"); + return ret; + } + catch (Exception ex) + { + LogError("GetDistributionListGeneralSettings", ex); + throw; + } + } + + [WebMethod, SoapHeader("settings")] + public void SetDistributionListGeneralSettings(string accountName, string displayName, bool hideFromAddressBook, string managedBy, string[] members, string notes, string[] addressLists) + { + try + { + LogStart("SetDistributionListGeneralSettings"); + ES.SetDistributionListGeneralSettings(accountName, displayName, hideFromAddressBook, managedBy, members, notes, addressLists); + LogEnd("SetDistributionListGeneralSettings"); + } + catch (Exception ex) + { + LogError("SetDistributionListGeneralSettings", ex); + throw; + } + } + + [WebMethod, SoapHeader("settings")] + public ExchangeDistributionList GetDistributionListMailFlowSettings(string accountName) + { + try + { + LogStart("GetDistributionListMailFlowSettings"); + ExchangeDistributionList ret = ES.GetDistributionListMailFlowSettings(accountName); + LogEnd("GetDistributionListMailFlowSettings"); + return ret; + } + catch (Exception ex) + { + LogError("GetDistributionListMailFlowSettings", ex); + throw; + } + } + + [WebMethod, SoapHeader("settings")] + public void SetDistributionListMailFlowSettings(string accountName, string[] acceptAccounts, string[] rejectAccounts, bool requireSenderAuthentication, string[] addressLists) + { + try + { + LogStart("SetDistributionListMailFlowSettings"); + ES.SetDistributionListMailFlowSettings(accountName, acceptAccounts, rejectAccounts, requireSenderAuthentication, addressLists); + LogEnd("SetDistributionListMailFlowSettings"); + } + catch (Exception ex) + { + LogError("SetDistributionListMailFlowSettings", ex); + throw; + } + } + + [WebMethod, SoapHeader("settings")] + public ExchangeEmailAddress[] GetDistributionListEmailAddresses(string accountName) + { + try + { + LogStart("GetDistributionListEmailAddresses"); + ExchangeEmailAddress[] ret = ES.GetDistributionListEmailAddresses(accountName); + LogEnd("GetDistributionListEmailAddresses"); + return ret; + } + catch (Exception ex) + { + LogError("GetDistributionListEmailAddresses", ex); + throw; + } + } + + [WebMethod, SoapHeader("settings")] + public void SetDistributionListEmailAddresses(string accountName, string[] emailAddresses, string[] addressLists) + { + try + { + LogStart("SetDistributionListEmailAddresses"); + ES.SetDistributionListEmailAddresses(accountName, emailAddresses, addressLists); + LogEnd("SetDistributionListEmailAddresses"); + } + catch (Exception ex) + { + LogError("SetDistributionListEmailAddresses", ex); + throw; + } + } + + [WebMethod, SoapHeader("settings")] + public void SetDistributionListPrimaryEmailAddress(string accountName, string emailAddress, string[] addressLists) + { + try + { + LogStart("SetDistributionListPrimaryEmailAddress"); + ES.SetDistributionListPrimaryEmailAddress(accountName, emailAddress, addressLists); + LogEnd("SetDistributionListPrimaryEmailAddress"); + } + catch (Exception ex) + { + LogError("SetDistributionListPrimaryEmailAddress", ex); + throw; + } + } + + [WebMethod, SoapHeader("settings")] + public void SetDistributionListPermissions(string organizationId, string accountName, string[] sendAsAccounts, string[] sendOnBehalfAccounts, string[] addressLists) + { + ES.SetDistributionListPermissions(organizationId, accountName, sendAsAccounts, sendOnBehalfAccounts, addressLists); + } + [WebMethod, SoapHeader("settings")] public ExchangeDistributionList GetDistributionListPermissions(string organizationId, string accountName) { return ES.GetDistributionListPermissions(organizationId, accountName); } - + #endregion @@ -1048,148 +1070,148 @@ namespace WebsitePanel.Server #endregion - #region ActiveSync - [WebMethod, SoapHeader("settings")] - public void CreateOrganizationActiveSyncPolicy(string organizationId) - { - try - { - LogStart("CreateOrganizationActiveSyncPolicy"); - ES.CreateOrganizationActiveSyncPolicy(organizationId); - LogEnd("CreateOrganizationActiveSyncPolicy"); - } - catch (Exception ex) - { - LogError("CreateOrganizationActiveSyncPolicy", ex); - throw; - } - } + #region ActiveSync + [WebMethod, SoapHeader("settings")] + public void CreateOrganizationActiveSyncPolicy(string organizationId) + { + try + { + LogStart("CreateOrganizationActiveSyncPolicy"); + ES.CreateOrganizationActiveSyncPolicy(organizationId); + LogEnd("CreateOrganizationActiveSyncPolicy"); + } + catch (Exception ex) + { + LogError("CreateOrganizationActiveSyncPolicy", ex); + throw; + } + } - [WebMethod, SoapHeader("settings")] - public ExchangeActiveSyncPolicy GetActiveSyncPolicy(string organizationId) - { - try - { - LogStart("GetActiveSyncPolicy"); - ExchangeActiveSyncPolicy ret = ES.GetActiveSyncPolicy(organizationId); - LogEnd("GetActiveSyncPolicy"); - return ret; - } - catch (Exception ex) - { - LogError("GetActiveSyncPolicy", ex); - throw; - } - } + [WebMethod, SoapHeader("settings")] + public ExchangeActiveSyncPolicy GetActiveSyncPolicy(string organizationId) + { + try + { + LogStart("GetActiveSyncPolicy"); + ExchangeActiveSyncPolicy ret = ES.GetActiveSyncPolicy(organizationId); + LogEnd("GetActiveSyncPolicy"); + return ret; + } + catch (Exception ex) + { + LogError("GetActiveSyncPolicy", ex); + throw; + } + } - [WebMethod, SoapHeader("settings")] - public void SetActiveSyncPolicy(string id, bool allowNonProvisionableDevices, bool attachmentsEnabled, - int maxAttachmentSizeKB, bool uncAccessEnabled, bool wssAccessEnabled, bool devicePasswordEnabled, - bool alphanumericPasswordRequired, bool passwordRecoveryEnabled, bool deviceEncryptionEnabled, - bool allowSimplePassword, int maxPasswordFailedAttempts, int minPasswordLength, int inactivityLockMin, - int passwordExpirationDays, int passwordHistory, int refreshInterval) - { - try - { - LogStart("SetActiveSyncPolicy"); - ES.SetActiveSyncPolicy(id, allowNonProvisionableDevices, attachmentsEnabled, - maxAttachmentSizeKB, uncAccessEnabled, wssAccessEnabled, devicePasswordEnabled, alphanumericPasswordRequired, passwordRecoveryEnabled, - deviceEncryptionEnabled, allowSimplePassword, maxPasswordFailedAttempts, - minPasswordLength, inactivityLockMin, passwordExpirationDays, passwordHistory, refreshInterval); - LogEnd("SetActiveSyncPolicy"); - } - catch (Exception ex) - { - LogError("SetActiveSyncPolicy", ex); - throw; - } - } - #endregion + [WebMethod, SoapHeader("settings")] + public void SetActiveSyncPolicy(string id, bool allowNonProvisionableDevices, bool attachmentsEnabled, + int maxAttachmentSizeKB, bool uncAccessEnabled, bool wssAccessEnabled, bool devicePasswordEnabled, + bool alphanumericPasswordRequired, bool passwordRecoveryEnabled, bool deviceEncryptionEnabled, + bool allowSimplePassword, int maxPasswordFailedAttempts, int minPasswordLength, int inactivityLockMin, + int passwordExpirationDays, int passwordHistory, int refreshInterval) + { + try + { + LogStart("SetActiveSyncPolicy"); + ES.SetActiveSyncPolicy(id, allowNonProvisionableDevices, attachmentsEnabled, + maxAttachmentSizeKB, uncAccessEnabled, wssAccessEnabled, devicePasswordEnabled, alphanumericPasswordRequired, passwordRecoveryEnabled, + deviceEncryptionEnabled, allowSimplePassword, maxPasswordFailedAttempts, + minPasswordLength, inactivityLockMin, passwordExpirationDays, passwordHistory, refreshInterval); + LogEnd("SetActiveSyncPolicy"); + } + catch (Exception ex) + { + LogError("SetActiveSyncPolicy", ex); + throw; + } + } + #endregion - #region Mobile devices - [WebMethod, SoapHeader("settings")] - public ExchangeMobileDevice[] GetMobileDevices(string accountName) - { - try - { - LogStart("GetMobileDevices"); - ExchangeMobileDevice[] ret = ES.GetMobileDevices(accountName); - LogEnd("GetMobileDevices"); - return ret; - } - catch (Exception ex) - { - LogError("GetMobileDevices", ex); - throw; - } - } + #region Mobile devices + [WebMethod, SoapHeader("settings")] + public ExchangeMobileDevice[] GetMobileDevices(string accountName) + { + try + { + LogStart("GetMobileDevices"); + ExchangeMobileDevice[] ret = ES.GetMobileDevices(accountName); + LogEnd("GetMobileDevices"); + return ret; + } + catch (Exception ex) + { + LogError("GetMobileDevices", ex); + throw; + } + } - [WebMethod, SoapHeader("settings")] - public ExchangeMobileDevice GetMobileDevice(string id) - { - try - { - LogStart("GetMobileDevice"); - ExchangeMobileDevice ret = ES.GetMobileDevice(id); - LogEnd("GetMobileDevice"); - return ret; - } - catch (Exception ex) - { - LogError("GetMobileDevice", ex); - throw; - } - } - - [WebMethod, SoapHeader("settings")] - public void WipeDataFromDevice(string id) - { - try - { - LogStart("WipeDataFromDevice"); - ES.WipeDataFromDevice(id); - LogEnd("WipeDataFromDevice"); - } - catch (Exception ex) - { - LogError("WipeDataFromDevice", ex); - throw; - } - } + [WebMethod, SoapHeader("settings")] + public ExchangeMobileDevice GetMobileDevice(string id) + { + try + { + LogStart("GetMobileDevice"); + ExchangeMobileDevice ret = ES.GetMobileDevice(id); + LogEnd("GetMobileDevice"); + return ret; + } + catch (Exception ex) + { + LogError("GetMobileDevice", ex); + throw; + } + } - [WebMethod, SoapHeader("settings")] - public void CancelRemoteWipeRequest(string id) - { - try - { - LogStart("CancelRemoteWipeRequest"); - ES.CancelRemoteWipeRequest(id); - LogEnd("CancelRemoteWipeRequest"); - } - catch (Exception ex) - { - LogError("CancelRemoteWipeRequest", ex); - throw; - } - } + [WebMethod, SoapHeader("settings")] + public void WipeDataFromDevice(string id) + { + try + { + LogStart("WipeDataFromDevice"); + ES.WipeDataFromDevice(id); + LogEnd("WipeDataFromDevice"); + } + catch (Exception ex) + { + LogError("WipeDataFromDevice", ex); + throw; + } + } + + [WebMethod, SoapHeader("settings")] + public void CancelRemoteWipeRequest(string id) + { + try + { + LogStart("CancelRemoteWipeRequest"); + ES.CancelRemoteWipeRequest(id); + LogEnd("CancelRemoteWipeRequest"); + } + catch (Exception ex) + { + LogError("CancelRemoteWipeRequest", ex); + throw; + } + } - [WebMethod, SoapHeader("settings")] - public void RemoveDevice(string id) - { - try - { - LogStart("RemoveDevice"); - ES.RemoveDevice(id); - LogEnd("RemoveDevice"); - } - catch (Exception ex) - { - LogError("RemoveDevice", ex); - throw; - } - } - #endregion + [WebMethod, SoapHeader("settings")] + public void RemoveDevice(string id) + { + try + { + LogStart("RemoveDevice"); + ES.RemoveDevice(id); + LogEnd("RemoveDevice"); + } + catch (Exception ex) + { + LogError("RemoveDevice", ex); + throw; + } + } + #endregion protected void LogStart(string func) { diff --git a/WebsitePanel/Sources/WebsitePanel.Server/Organizations.asmx.cs b/WebsitePanel/Sources/WebsitePanel.Server/Organizations.asmx.cs index f057ec76..775058d8 100644 --- a/WebsitePanel/Sources/WebsitePanel.Server/Organizations.asmx.cs +++ b/WebsitePanel/Sources/WebsitePanel.Server/Organizations.asmx.cs @@ -67,14 +67,14 @@ namespace WebsitePanel.Server throw; } } - - + + [WebMethod, SoapHeader("settings")] public Organization CreateOrganization(string organizationId) { try { - Log.WriteStart("'{0}' CreateOrganization", ProviderSettings.ProviderName); + Log.WriteStart("'{0}' CreateOrganization", ProviderSettings.ProviderName); Organization ret = Organization.CreateOrganization(organizationId); Log.WriteEnd("'{0}' CreateOrganization", ProviderSettings.ProviderName); return ret; @@ -85,21 +85,17 @@ namespace WebsitePanel.Server throw; } } - + [WebMethod, SoapHeader("settings")] public void DeleteOrganization(string organizationId) { - Organization.DeleteOrganization(organizationId); + Organization.DeleteOrganization(organizationId); } [WebMethod, SoapHeader("settings")] - public void CreateUser(string organizationId, string loginName, string displayName, string upn, string password, bool enabled) + public int CreateUser(string organizationId, string loginName, string displayName, string upn, string password, bool enabled) { - Log.WriteStart("'{0} CreateUser", ProviderSettings.ProviderName); - - Organization.CreateUser(organizationId, loginName, displayName, upn, password, enabled); - - Log.WriteEnd("'{0}' CreateUser", ProviderSettings.ProviderName); + return Organization.CreateUser(organizationId, loginName, displayName, upn, password, enabled); } [WebMethod, SoapHeader("settings")] @@ -109,7 +105,7 @@ namespace WebsitePanel.Server } [WebMethod, SoapHeader("settings")] - public OrganizationUser GeUserGeneralSettings(string loginName, string organizationId) + public OrganizationUser GetUserGeneralSettings(string loginName, string organizationId) { return Organization.GetUserGeneralSettings(loginName, organizationId); } @@ -132,9 +128,9 @@ namespace WebsitePanel.Server [WebMethod, SoapHeader("settings")] public void DeleteOrganizationDomain(string organizationDistinguishedName, string domain) { - Organization.DeleteOrganizationDomain(organizationDistinguishedName, domain); + Organization.DeleteOrganizationDomain(organizationDistinguishedName, domain); } - + [WebMethod, SoapHeader("settings")] public void CreateOrganizationDomain(string organizationDistinguishedName, string domain) { @@ -147,5 +143,10 @@ namespace WebsitePanel.Server return Organization.GetPasswordPolicy(); } + [WebMethod, SoapHeader("settings")] + public string GetSamAccountNameByUserPrincipalName(string organizationId, string userPrincipalName) + { + return Organization.GetSamAccountNameByUserPrincipalName(organizationId, userPrincipalName); + } } } diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/App_Data/SiteSettings.config b/WebsitePanel/Sources/WebsitePanel.WebPortal/App_Data/SiteSettings.config index 0a99be01..e40147a6 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/App_Data/SiteSettings.config +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/App_Data/SiteSettings.config @@ -3,7 +3,7 @@ WebsitePanel - http://localhost:9002 + http://localhost:9005 UserCulture UserTheme diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/App_Data/WebsitePanel_Modules.config b/WebsitePanel/Sources/WebsitePanel.WebPortal/App_Data/WebsitePanel_Modules.config index c979a2a4..76798152 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/App_Data/WebsitePanel_Modules.config +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/App_Data/WebsitePanel_Modules.config @@ -486,7 +486,10 @@ - + + + + diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/App_GlobalResources/WebsitePanel_SharedResources.ascx.resx b/WebsitePanel/Sources/WebsitePanel.WebPortal/App_GlobalResources/WebsitePanel_SharedResources.ascx.resx index 2bf42484..c04ed97a 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/App_GlobalResources/WebsitePanel_SharedResources.ascx.resx +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/App_GlobalResources/WebsitePanel_SharedResources.ascx.resx @@ -2806,7 +2806,7 @@ Contacts per Organization - Max mailbox size, MB + Mailbox storage, MB Distribution Lists per Organization @@ -2850,6 +2850,18 @@ Public Folders per Organization + + Keep Deleted Items (Days) + + + Maximum Recipients + + + Maximum Send Message Size (Kb) + + + Maximum Receive Message Size (Kb) + Hosted Exchange @@ -4990,4 +5002,7 @@ Use shared SSL Root + + Consumer Organization Support + \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/App_Themes/Default/Images/Exchange/blank16.gif b/WebsitePanel/Sources/WebsitePanel.WebPortal/App_Themes/Default/Images/Exchange/blank16.gif new file mode 100644 index 0000000000000000000000000000000000000000..ca92d53faf0df9e9270c469e3395e67af015b888 GIT binary patch literal 832 zcmW-fA+8`a7=-5q#Nu9p1wn8WHz8rO9u^d)4uhFBO z4SlboY5OOg|Nmyb{qCEuU;gxnNBjVM_TPsO|9tQjzQkQmZ*QIsARxd%fMNiH7{V|{ zFp3FGVhYok!7LWAh$Spz1*_P=CbqDR9qi%&hd9D9PH=kvMu`eF8uVVSHVF|Xa%&vm zAcr{25sq?#lbqr-XE@6RE^>*>T;VD=xXCSUbBDV;;31EA%oConV9AO#8}{~b$EF~` zLT+0c(4dAitPzcBLX(=(v}QD`1ubex%UaQ@HngcNZEHunI?$nxbgUDds!*v)wHoyz zxWsA5u#ro|10M8{hdts^Pk7Q(p7xAqz2HSJdD$yo^@caS zxpw1T`qyj*3LNB`k%0_mD8m`aXeKh5sZ3`kvsuVuma?3ctY#yd*~)fyvYUe(<|xNG z$!Us|sZys&`xJ!h#zk`by2TrXfev=4!yV~pCpy`wPIsoWUFc$$y4;nncB7l!>UMX! z+k+nVsK-6&c@n!pyKZ0PckXBL=hQ!MFFwV;AAR!r-EV*V^5Ww!e*F90?|;5|{QUc0 OU%!9**Ut|Rc=bOgEs9P6 literal 0 HcmV?d00001 diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/App_Themes/Default/Images/Exchange/disabled.png b/WebsitePanel/Sources/WebsitePanel.WebPortal/App_Themes/Default/Images/Exchange/disabled.png new file mode 100644 index 0000000000000000000000000000000000000000..2fa793d1cad3454141bd5b98fc261f66999c22c0 GIT binary patch literal 676 zcmV;V0$crwP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!~g&e!~vBn4jTXf0y#-UK~y+TWm8RS z6hRPu-81fPCL6;_*cc*64&p^ra8I7RRCE z<^$Z?-Ud6_e{UKeUSR3^O@yN!^mGIxvt)<1V3K5elL&@Z5)N_N8)EaxbMWT)C(Onc z{Iw0R)is#LI(QIVuKHE_-vBCA@Z}YFw5ru51hop1_8~Zwf|(959`zAW7f&WoXMZ5u z-yu(q!D=4F@fUc_Ys4gi3MT;fXru2~aidb0kZAY11&gwFaqy0+R$$R?*2x4$!~n}Y z;xGz2iZDAmK>zJ4#QVEo(Wsz{U_GlxXtnd&3Iws%#{6SIXw9;f)r1nN0cx#B(BpyY zXf@l&wda_#bPNzp5yeDLM9_qjk9&m*+3$ku2o{+b79Ly{Py&j&t=_l|=2vhfsKcZJ zX7r12R?siYa2`-Fdbrg3Kl-)SL(=G@dcQ?-=soN^T%_+z^r_n-{j&3mQ*a}U&kKoM zlcUS_kdV7R9U_}hc7AaRmi}xSfu$0L9!^&QDw)p7C_BG6g}ilsH@MKiED7giq;w}N z6YIP@?|{h=>i1XZK?m}p1IyY+om-<Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!~g&e!~vBn4jTXf0%S=ZrK=^m|$h>pTO9yNSzoM5b8h~8CWP%mol|e zm#R&rqC(RoN8&qQY@ZK5Cyi3Xvrg|l`}y>N`CDJ6t zKn#$|6j$*Ty1a{S+O+@#G#wKw&kSE_g@{FPGRJP-kvot=qEIc2d~xI(odzz31A+#ER)nSlLakdCy|nHUvJds-u40%{lA z_D0BDLL920rBA00;~_TgZD1u@!Kz-xLT3R>ddaR4AOR7R2?Gka;rR4FJjaRi?l-w*YkFa(fwJAq49%ob*qyVg^$TVL!xS z=Md|Kb?jC5kVRt#+R;ej#5R#h2G8}tGd{`xH%HAR*;WF*FgksZ4iJe5EM@4Vok>nb zffv}hv%62.0 - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Cancel @@ -219,4 +219,7 @@ Please select hosting plan + + Automated Hosted Organization Provisioning + \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/App_LocalResources/ExchangeActiveSyncSettings.ascx.resx b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/App_LocalResources/ExchangeActiveSyncSettings.ascx.resx index 28496e91..7a93b328 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/App_LocalResources/ExchangeActiveSyncSettings.ascx.resx +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/App_LocalResources/ExchangeActiveSyncSettings.ascx.resx @@ -112,10 +112,10 @@ 2.0 - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 ShowProgressDialog('Updating ActiveSync settings...'); @@ -151,7 +151,7 @@ Windows SharePoint Services - <p>Exchange Server 2007 enables users who have mobile devices to synchronize mailbox data by using Exchange ActiveSync. Users can synchronize e-mail, contacts, calendars, and task folders. </p><p> + <p>Exchange Server enables users who have mobile devices to synchronize mailbox data by using Exchange ActiveSync. Users can synchronize e-mail, contacts, calendars, and task folders. </p><p> ActiveSync mailbox policy allows you to apply a common set of security settings to all users in organization. </p> diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/App_LocalResources/ExchangeAddDomainName.ascx.resx b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/App_LocalResources/ExchangeAddDomainName.ascx.resx index fcbdac5d..1b687b23 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/App_LocalResources/ExchangeAddDomainName.ascx.resx +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/App_LocalResources/ExchangeAddDomainName.ascx.resx @@ -112,13 +112,16 @@ 2.0 - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + Cancel + - Enter domain name, e.g. "mydomain.com" or "sub.mydomain.com" + Select a domain name, e.g. "mydomain.com" or "sub.mydomain.com" Add Domain Name diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/App_LocalResources/ExchangeMailboxAdvancedSettings.ascx.resx b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/App_LocalResources/ExchangeAddMailboxPlan.ascx.resx similarity index 78% rename from WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/App_LocalResources/ExchangeMailboxAdvancedSettings.ascx.resx rename to WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/App_LocalResources/ExchangeAddMailboxPlan.ascx.resx index ebca9e9b..4549ab13 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/App_LocalResources/ExchangeMailboxAdvancedSettings.ascx.resx +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/App_LocalResources/ExchangeAddMailboxPlan.ascx.resx @@ -112,20 +112,17 @@ 2.0 - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - ShowProgressDialog('Updating mailbox settings...'); - - - Save Changes - ActiveSync + + Hide from Addressbook + IMAP @@ -135,20 +132,11 @@ OWA/HTTP - - Allow these settings to be managed from <b>Personal Mailbox Manager</b> - POP3 - - Use organization defaults - - - Use organization defaults - - <p>In "Mailbox Features" section you may enable/disable specific access protocols for the mailbox.</p><p>You may override mailbox quotas and retention period defined on the organization level. Please note, that you cannot specify storage settings higher than defined in the space hosting plan.</p><p><b>Domain User Name</b> is used when setting up mailbox in Outlook 2003/2007.</p> + <p> A Mailbox plan is a template that defines the characteristics of a mailbox </p> <p>The mailbox plan name needs to be unique. A mailbox plan cannot be modified. In case a mailbox needs a mailbox plan with another characteristics, a new mailbox plan needs to be created and assigned to the mailbox. A mailbox plan can only be deleted when the plan is not assigned to any mailboxes. </p> days @@ -162,11 +150,17 @@ Keep deleted items for: - - Last Logoff: + + Mailbox size: - - Last Logon: + + Maximum Receive Message Size: + + + Maximum Recipients: + + + Maximum Send Message Size: Prohibit send at: @@ -175,13 +169,7 @@ Prohibit send and receive at: - Edit Mailbox - - - Total Items: - - - Total Size (MB): + Add Mailbox plan When the mailbox size exceeds the indicated amount: @@ -189,19 +177,25 @@ Delete Item Retention - - Domain User Name - Mailbox Features - - Mailbox Statistics + + General + + + Mailbox plan - Mailbox Quotas + Quotas - Mailboxes + Mailbox plan + + + Please enter correct mailboxplan + + + * \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/App_LocalResources/ExchangeContactGeneralSettings.ascx.resx b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/App_LocalResources/ExchangeContactGeneralSettings.ascx.resx index a775ec0b..68b60ab8 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/App_LocalResources/ExchangeContactGeneralSettings.ascx.resx +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/App_LocalResources/ExchangeContactGeneralSettings.ascx.resx @@ -112,10 +112,10 @@ 2.0 - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 ShowProgressDialog('Updating contact settings...'); diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/App_LocalResources/ExchangeContactMailFlowSettings.ascx.resx b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/App_LocalResources/ExchangeContactMailFlowSettings.ascx.resx index 8bd04c62..9ea225b7 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/App_LocalResources/ExchangeContactMailFlowSettings.ascx.resx +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/App_LocalResources/ExchangeContactMailFlowSettings.ascx.resx @@ -112,10 +112,10 @@ 2.0 - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 ShowProgressDialog('Updating contact settings...'); diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/App_LocalResources/ExchangeContacts.ascx.resx b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/App_LocalResources/ExchangeContacts.ascx.resx index 2b5d6c02..20eeb913 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/App_LocalResources/ExchangeContacts.ascx.resx +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/App_LocalResources/ExchangeContacts.ascx.resx @@ -112,10 +112,10 @@ 2.0 - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Create New Contact diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/App_LocalResources/ExchangeCreateContact.ascx.resx b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/App_LocalResources/ExchangeCreateContact.ascx.resx index 51270a74..2048b51e 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/App_LocalResources/ExchangeCreateContact.ascx.resx +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/App_LocalResources/ExchangeCreateContact.ascx.resx @@ -112,10 +112,10 @@ 2.0 - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 ShowProgressDialog('Creating contact...'); diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/App_LocalResources/ExchangeCreateDistributionList.ascx.resx b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/App_LocalResources/ExchangeCreateDistributionList.ascx.resx index e1165b0f..c089926b 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/App_LocalResources/ExchangeCreateDistributionList.ascx.resx +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/App_LocalResources/ExchangeCreateDistributionList.ascx.resx @@ -112,10 +112,10 @@ 2.0 - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 ShowProgressDialog('Creating distribution list...'); @@ -124,7 +124,7 @@ Create Distribution List - <p><b>Display Name</b> will be shown in the GAL in Outlook and OWA.</p><p>You can add new Domain Names on "Domain Names" page. We always provide you with a free domain that would allow your organization migrating to Exchange as soon as possible.</p><p><b>Primary E-Mail Address</b> is shown in the GAL and in "From" field of all messages sent from this DL.</p> + <p><b>Display Name</b> will be shown in the GAL in Outlook and OWA.</p><p>You can add new Domain Names on "Domain Names" page. </p><p><b>Primary E-Mail Address</b> is shown in the GAL and in "From" field of all messages sent from this DL.</p> E-mail Address: * @@ -132,22 +132,22 @@ Display Name: * + + Managed by: * + Create New Distribution List Distribution Lists + + Please specify a manager + Enter Display Name * - - Managed by: * - - - Please specify a manager - \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/App_LocalResources/ExchangeCreateMailbox.ascx.resx b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/App_LocalResources/ExchangeCreateMailbox.ascx.resx index f921332b..edd62354 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/App_LocalResources/ExchangeCreateMailbox.ascx.resx +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/App_LocalResources/ExchangeCreateMailbox.ascx.resx @@ -112,10 +112,10 @@ 2.0 - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 ShowProgressDialog('Creating mailbox...'); @@ -134,7 +134,7 @@ <p><b>E-Mail Address</b> is a User Principal Name (UPN). It is used as a logon name in Outlook, Outlook Web Access (OWA) or SharePoint.</p> -<p>New organization domains can be added on "Domain Names" page. Temporary domain name is provided by default to allow creating new accounts as soon as possible.</p> +<p>New organization domains can be added on "Domain Names" page.</p> <p>Make sure your password is strong enough, i.e. contains lower and capital letters, numbers and symbols. @@ -156,6 +156,9 @@ Password: * + + Subscriber Number: * + Create New Mailbox @@ -183,4 +186,10 @@ * + + Enter Subscriber Number + + + * + \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/App_LocalResources/ExchangeDistributionListEmailAddresses.ascx.resx b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/App_LocalResources/ExchangeDistributionListEmailAddresses.ascx.resx index f01bbe92..56dab2cf 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/App_LocalResources/ExchangeDistributionListEmailAddresses.ascx.resx +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/App_LocalResources/ExchangeDistributionListEmailAddresses.ascx.resx @@ -112,10 +112,10 @@ 2.0 - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Add E-mail Address @@ -127,7 +127,7 @@ Set As Primary - <b>Primary E-Mail Address</b> is a User Principal Name (UPN). It will be used as a login in Outlook 2003/2007 and Outlook Web Access (OWA). Also, Primary E-Mail Address will be shown in "From" field of messages sent from this mailbox.</p><p>You can add new Domain Names on "Domain Names" page. We always provide you with a free domain that would allow your organization migrating to Exchange as soon as possible.</p><p>E-mail addresses of all Exchange accounts should be unique across the organization. You cannot add the same e-mail address to several accounts.</p> + <b>Primary E-Mail Address</b> is a User Principal Name (UPN). It will be used as a login in Outlook and Outlook Web Access (OWA). Also, Primary E-Mail Address will be shown in "From" field of messages sent from this mailbox.</p><p>You can add new Domain Names on "Domain Names" page.</p><p>E-mail addresses of all Exchange accounts should be unique across the organization. You cannot add the same e-mail address to several accounts.</p> E-mail Address diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/App_LocalResources/ExchangeDistributionListGeneralSettings.ascx.resx b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/App_LocalResources/ExchangeDistributionListGeneralSettings.ascx.resx index b8b475b0..56de9930 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/App_LocalResources/ExchangeDistributionListGeneralSettings.ascx.resx +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/App_LocalResources/ExchangeDistributionListGeneralSettings.ascx.resx @@ -112,10 +112,10 @@ 2.0 - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 ShowProgressDialog('Updating distribution list settings...'); @@ -144,13 +144,13 @@ Distribution Lists + + Please specify a manager + Enter Display Name * - - Please specify a manager - \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/App_LocalResources/ExchangeDistributionListMailFlowSettings.ascx.resx b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/App_LocalResources/ExchangeDistributionListMailFlowSettings.ascx.resx index c2911ebf..3df43c86 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/App_LocalResources/ExchangeDistributionListMailFlowSettings.ascx.resx +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/App_LocalResources/ExchangeDistributionListMailFlowSettings.ascx.resx @@ -112,10 +112,10 @@ 2.0 - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 ShowProgressDialog('Updating distribution list settings...'); diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/App_LocalResources/ExchangeDistributionLists.ascx.resx b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/App_LocalResources/ExchangeDistributionLists.ascx.resx index 85d2a8eb..b5f5a8ad 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/App_LocalResources/ExchangeDistributionLists.ascx.resx +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/App_LocalResources/ExchangeDistributionLists.ascx.resx @@ -112,10 +112,10 @@ 2.0 - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Create New Distribution List diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/App_LocalResources/ExchangeDomainNames.ascx.resx b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/App_LocalResources/ExchangeDomainNames.ascx.resx index a8fea59b..d8f453a2 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/App_LocalResources/ExchangeDomainNames.ascx.resx +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/App_LocalResources/ExchangeDomainNames.ascx.resx @@ -112,10 +112,10 @@ 2.0 - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Add New Domain @@ -142,11 +142,9 @@ Domain Name - <p>Each organization can have several domain names. These domain names are used as part of the primary e-mail address (UPN) of the new accounts. Exchange-enabled organizations use domain name when creating e-mail addresses for mailboxes, distribution lists and mail-enabled public folders. Domain name is also used when creating new site collection in SharePoint.</p> - + <p>Each organization can have several domain names. These domain names are used as part of the primary e-mail address (UPN) of the new accounts. Exchange-enabled organizations use domain name when creating e-mail addresses for mailboxes, and distribution lists. Domain name is also used when creating new site collection in SharePoint.</p> <p>Default domain name is selected by default when creating a new e-mail address. You can always change default domain name and it will not affect existing accounts.</p> - -<p>For each domain name WebsitePanel creates a corresponding DNS Zone. You can edit DNS zone records by clicking domain name link. If you are unsure about the structure of DNS zone, please do not modify zone records.</p> +<p>For each domain name a corresponding DNS Zone is created. You can edit DNS zone records by clicking domain name link. If you are unsure about the structure of DNS zone, please do not modify zone records.</p> Total Domain Names Used: diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/App_LocalResources/ExchangeDomainRecords.ascx.resx b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/App_LocalResources/ExchangeDomainRecords.ascx.resx index 556b31c4..3096f457 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/App_LocalResources/ExchangeDomainRecords.ascx.resx +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/App_LocalResources/ExchangeDomainRecords.ascx.resx @@ -112,10 +112,10 @@ 2.0 - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Add record @@ -130,7 +130,7 @@ Save - <p>For each domain name WebsitePanel creates a corresponding DNS Zone. If you are unsure about the structure of DNS zone, please do not modify zone records.</p> + <p>For each domain name a corresponding DNS Zone is created. If you are unsure about the structure of DNS zone, please do not modify zone records.</p> No DNS records defined. diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/App_LocalResources/ExchangeMailboxEmailAddresses.ascx.resx b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/App_LocalResources/ExchangeMailboxEmailAddresses.ascx.resx index 137621eb..31627731 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/App_LocalResources/ExchangeMailboxEmailAddresses.ascx.resx +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/App_LocalResources/ExchangeMailboxEmailAddresses.ascx.resx @@ -112,10 +112,10 @@ 2.0 - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Add E-mail Address @@ -130,7 +130,7 @@ Allow these settings to be managed from <b>Personal Mailbox Manager</b> - <b>Primary E-Mail Address</b> is a User Principal Name (UPN). It will be used as a login in Outlook 2003/2007 and Outlook Web Access (OWA). Also, Primary E-Mail Address will be shown in "From" field of messages sent from this mailbox.</p><p>You can add new Domain Names on "Domain Names" page. We always provide you with a free domain that would allow your organization migrating to Exchange as soon as possible.</p><p>E-mail addresses of all Exchange accounts should be unique across the organization. You cannot add the same e-mail address to several accounts.</p> + <b>Primary E-Mail Address</b> is a User Principal Name (UPN). It will be used as a login in Outlook and Outlook Web Access (OWA). Also, Primary E-Mail Address will be shown in "From" field of messages sent from this mailbox.</p><p>You can add new Domain Names on "Domain Names" page. </p><p>E-mail addresses of all Exchange accounts should be unique across the organization. You cannot add the same e-mail address to several accounts.</p> E-mail Address diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/App_LocalResources/ExchangeMailboxGeneralSettings.ascx.resx b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/App_LocalResources/ExchangeMailboxGeneralSettings.ascx.resx index 93dbf852..952e1037 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/App_LocalResources/ExchangeMailboxGeneralSettings.ascx.resx +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/App_LocalResources/ExchangeMailboxGeneralSettings.ascx.resx @@ -112,10 +112,10 @@ 2.0 - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 ShowProgressDialog('Updating mailbox settings...'); @@ -133,85 +133,22 @@ Allow these settings to be managed from <b>Personal Mailbox Manager</b> - <p>The General tab displays general information about the mailbox user. Use this tab to view or modify the display name, password, company information, contact information and address. You can also specify whether to disable the mailbox user or hide the mailbox user from Exchange address lists.</p> + <p>The General tab displays general information about the mailbox Use this tab to view or modify the mailbox characteristics such as size and show in your address book in the Exchange address lists. You can also specify whether to disable the mailbox user.</p> - - Address: + + Mailbox plan: - - Business Phone: - - - City: - - - Company: - - - Country/Region: - - - Department: - - - Display Name: * - - - Fax: - - - First Name: - - - Home Phone: - - - Initials: - - - Job Title: - - - Last Name: - - - Manager: - - - Mobile Phone: - - - Notes: - - - Office: - - - Pager: - - - Password: - - - State/Province: + + Mailbox size: Edit Mailbox - - Web Page: + + Calendar Settings - - Zip/Postal Code: - - - Address - - - Company Information - - - Contact Information + + General Mailboxes diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/App_LocalResources/ExchangeMailboxMailFlowSettings.ascx.resx b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/App_LocalResources/ExchangeMailboxMailFlowSettings.ascx.resx index 962a69de..3dfe91c1 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/App_LocalResources/ExchangeMailboxMailFlowSettings.ascx.resx +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/App_LocalResources/ExchangeMailboxMailFlowSettings.ascx.resx @@ -112,10 +112,10 @@ 2.0 - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 ShowProgressDialog('Updating mailbox settings...'); diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/App_LocalResources/ExchangeMailboxMobile.ascx.resx b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/App_LocalResources/ExchangeMailboxMobile.ascx.resx index 31f224e8..7b809afa 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/App_LocalResources/ExchangeMailboxMobile.ascx.resx +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/App_LocalResources/ExchangeMailboxMobile.ascx.resx @@ -112,13 +112,13 @@ 2.0 - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - User Agent + + return confirm('Are you sure you want to remove the device partnership?'); Status @@ -126,34 +126,34 @@ Type + + User Agent + There are no mobile devices. + + <p>Manage mobile devices here.</p><p>To add a new device, begin a partnership with Microsoft Exchange from the device and it will appear in the device list.</p><p>You can remove devices that you are no longer using. If you forget your device password, you can access it here. If you lose your phone or mobile device, you can initiate a remote device wipe to protect your information.</p> + Last Sync Time + + Edit Mailbox + OK Pending Wipe + + Edit Mailbox + Unknown Wipe Successful - - return confirm('Are you sure you want to remove the device partnership?'); - - - Edit Mailbox - - - Edit Mailbox - - - <p>Manage mobile devices here.</p><p>To add a new device, begin a partnership with Microsoft Exchange from the device and it will appear in the device list.</p><p>You can remove devices that you are no longer using. If you forget your device password, you can access it here. If you lose your phone or mobile device, you can initiate a remote device wipe to protect your information.</p> - \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/App_LocalResources/ExchangeMailboxMobileDetails.ascx.resx b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/App_LocalResources/ExchangeMailboxMobileDetails.ascx.resx index d2aa6bc9..56efeeba 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/App_LocalResources/ExchangeMailboxMobileDetails.ascx.resx +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/App_LocalResources/ExchangeMailboxMobileDetails.ascx.resx @@ -112,11 +112,26 @@ 2.0 - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + Back + + + Cancel Pending Wipe Request + + + return confirm('Are you sure you want to wipe all data from your device?'); + + + Wipe All Data from Device + + + <p>Manage the mobile device here.</p><p>If you forget your device password, you can access it here. If you lose your phone or mobile device, you can initiate a remote device wipe to protect your information . You can also cancel a wipe request if it was initiated by accident or the device was found subsequently.</p> + Device wipe acnowledge time: @@ -165,37 +180,22 @@ Status: + + Edit Mailbox + OK Pending wipe + + Edit Mailbox + Unknown Wipe successful - - Back - - - Cancel Pending Wipe Request - - - Wipe All Data from Device - - - Edit Mailbox - - - Edit Mailbox - - - <p>Manage the mobile device here.</p><p>If you forget your device password, you can access it here. If you lose your phone or mobile device, you can initiate a remote device wipe to protect your information . You can also cancel a wipe request if it was initiated by accident or the device was found subsequently.</p> - - - return confirm('Are you sure you want to wipe all data from your device?'); - \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/App_LocalResources/ExchangeMailboxPermissions.ascx.resx b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/App_LocalResources/ExchangeMailboxPermissions.ascx.resx index ea2b0e5d..5e891cc2 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/App_LocalResources/ExchangeMailboxPermissions.ascx.resx +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/App_LocalResources/ExchangeMailboxPermissions.ascx.resx @@ -112,17 +112,23 @@ 2.0 - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 ShowProgressDialog('Updating mailbox permissions...'); + + Save Changes + <p>When you grant <b>Full Access</b> permission to a user, that user can open this mailbox and access all of its content.</p> <br><p>When you grant <b>Send As</b> permission to a user, that user can send messages as this mailbox. </p> <br><p>We do not recommend to use this setting together “Send on behalf” (“Send as”) – it may work unpredictable</p> + + Grant this permission to: + Full Access @@ -132,10 +138,4 @@ Permissions - - Grant this permission to: - - - Save Changes - \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ProviderControls/App_LocalResources/Exchange2010SP1_Settings.ascx.resx b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/App_LocalResources/ExchangeMailboxPlans.ascx.resx similarity index 74% rename from WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ProviderControls/App_LocalResources/Exchange2010SP1_Settings.ascx.resx rename to WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/App_LocalResources/ExchangeMailboxPlans.ascx.resx index 1dadcd94..68c5b189 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ProviderControls/App_LocalResources/Exchange2010SP1_Settings.ascx.resx +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/App_LocalResources/ExchangeMailboxPlans.ascx.resx @@ -112,36 +112,42 @@ 2.0 - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - Domain Templates + + Add New Mailbox plan - - Exchange Control Panel URL: + + Set Default Mailbox plan - - You can use [DOMAIN_NAME] variable for organization default domain. + + if(!confirm('Are you sure you want to delete selected mailbox plan?')) return false; else ShowProgressDialog('Deleting Mailbox plan...'); - - Offer ID: + + Delete - - Organization Template + + Delete Mailbox plan - - Program ID: + + Mailbox plan - - Temporary domain: + + Default Mailbox plan - - * + + No mailbox plans have been added yet. To add a new mailbox plan click "Add New Mailbox plan" button. - - * + + <p> A Mailbox plan is a template that defines the characteristics of a mailbox </p> <p>The mailbox plan name needs to be unique. A mailbox plan cannot be modified. In case a mailbox needs a mailbox plan with another characteristics, a new mailbox plan needs to be created and assigned to the mailbox. A mailbox plan can only be deleted when the plan is not assigned to any mailboxes. </p> + + + Mailbox plans + + + Mailbox plans \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/App_LocalResources/ExchangeMailboxSetupInstructions.ascx.resx b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/App_LocalResources/ExchangeMailboxSetupInstructions.ascx.resx index ea0b1623..de0dd29b 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/App_LocalResources/ExchangeMailboxSetupInstructions.ascx.resx +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/App_LocalResources/ExchangeMailboxSetupInstructions.ascx.resx @@ -112,10 +112,10 @@ 2.0 - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Send diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/App_LocalResources/ExchangeMailboxes.ascx.resx b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/App_LocalResources/ExchangeMailboxes.ascx.resx index 9bcdbf5d..1aaeac3a 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/App_LocalResources/ExchangeMailboxes.ascx.resx +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/App_LocalResources/ExchangeMailboxes.ascx.resx @@ -112,10 +112,10 @@ 2.0 - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Create New Mailbox @@ -132,6 +132,9 @@ Search + + Domain Account + Display Name @@ -147,6 +150,12 @@ Primary E-mail Address + + Mailbox plan + + + Subscriber + <p><b>Mailboxes</b> are used to receive and send electronic messages. Each mailbox is a separate Exchange account which may be a person, room or inventory unit.</p> @@ -165,7 +174,4 @@ Mailboxes - - Domain Account - \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/App_LocalResources/ExchangeStorageLimits.ascx.resx b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/App_LocalResources/ExchangeStorageLimits.ascx.resx deleted file mode 100644 index e127ca84..00000000 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/App_LocalResources/ExchangeStorageLimits.ascx.resx +++ /dev/null @@ -1,162 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - ShowProgressDialog('Updating storage settings...'); - - - Save Changes - - - if(!confirm('Please be aware that applying new storage settings to all mailboxes can take significant time to complete. Do you want to proceed?')) return false; else ShowProgressDialog('Applying storage settings to mailboxes...'); - - - Save and Apply to All Mailboxes - - - <p>You can change storage limits and deleted items retention policy.</p><p>The settings will be applied for for new mailboxes only. By clicking "Save and Apply to All Mailboxes" button you can override these settings for all existing mailboxes.</p><p>Please note, that you cannot specify storage settings higher than defined in the space hosting plan.</p> - - - Issue warning at: - - - Keep deleted items for: - - - Prohibit send at: - - - Prohibit send and receive at: - - - Storage Settings - - - When the mailbox size exceeds the indicated amount: - - - Deletion Settings - - - Storage Settings - - - Storage Settings - - \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/App_LocalResources/ExchangeStorageUsage.ascx.resx b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/App_LocalResources/ExchangeStorageUsage.ascx.resx index a5ce0185..4046f8fd 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/App_LocalResources/ExchangeStorageUsage.ascx.resx +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/App_LocalResources/ExchangeStorageUsage.ascx.resx @@ -112,10 +112,10 @@ 2.0 - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 return confirm('Recalculating organization disk space may require certain time to complete and this task will be performed asynchronously. New disk space value will be available in a few minutes. Proceed with disk space calculation?'); @@ -123,8 +123,11 @@ Recalculate Disk Space + + ShowProgressDialog('Please wait...'); + - <p>Organization disk space usage is calculated on timely basis (usually once a day). You can recalculate it right now by clicking "Recalculate Disk Space" button.</p><p>Click on the link with used disk space to see usage breakdown by all organization mailboxes and public folders.</p> + <p>Organization disk space actual usage is calculated on timely basis (usually once a day). You can recalculate it right now by clicking "Recalculate Disk Space" button.</p><p>Click on the link with used disk space to see actual usage breakdown by all organization mailboxes.</p> Allocated Disk Space (MB): @@ -136,7 +139,7 @@ Storage Usage - Used Disk Space (MB): + Allocated Disk Space (MB): Storage Usage @@ -144,7 +147,4 @@ Unlimited - - ShowProgressDialog('Please wait...'); - \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/App_LocalResources/ExchangeStorageUsageBreakdown.ascx.resx b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/App_LocalResources/ExchangeStorageUsageBreakdown.ascx.resx index bf09c997..4a2785d0 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/App_LocalResources/ExchangeStorageUsageBreakdown.ascx.resx +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/App_LocalResources/ExchangeStorageUsageBreakdown.ascx.resx @@ -112,10 +112,10 @@ 2.0 - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 OK diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/App_LocalResources/OrganizationCreateOrganization.ascx.resx b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/App_LocalResources/OrganizationCreateOrganization.ascx.resx index 1357e558..4b45044c 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/App_LocalResources/OrganizationCreateOrganization.ascx.resx +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/App_LocalResources/OrganizationCreateOrganization.ascx.resx @@ -112,10 +112,10 @@ 2.0 - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 ShowProgressDialog('Creating Organization...'); @@ -124,7 +124,7 @@ Create Organization - <p><b>Organization name</b> is used just as display name for references purposes. It will not be used somewhere on Exchange Server.</p> <p><b>Organization ID</b> is an unique organization identifier. It can contain only numbers and letters and cannot be longer than 9 symbols. Organization ID will be used as GAL name and as a root public folder.</p> + <p><b>Organization name</b> is used just as display name for references purposes. It will not be used somewhere on Exchange Server.</p> <p><b>Organization ID</b> is an unique organization identifier. Organization ID will be used as GAL name.</p> Organization ID: * diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/App_LocalResources/OrganizationCreateUser.ascx.resx b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/App_LocalResources/OrganizationCreateUser.ascx.resx index 71721667..0d09f564 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/App_LocalResources/OrganizationCreateUser.ascx.resx +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/App_LocalResources/OrganizationCreateUser.ascx.resx @@ -112,10 +112,10 @@ 2.0 - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 ShowProgressDialog('Creating user...'); @@ -131,7 +131,7 @@ <p><b>E-Mail Address</b> is a User Principal Name (UPN). It is used as a logon name in Outlook, Outlook Web Access (OWA) or SharePoint.</p> -<p>New organization domains can be added on "Domain Names" page. Temporary domain name is provided by default to allow creating new users as soon as possible.</p> +<p>New organization domains can be added on "Domain Names" page.</p> <p>Make sure your password is strong enough, i.e. contains lower and capital letters, numbers and symbols.</p> @@ -144,6 +144,9 @@ Password: * + + Subscriber Number: * + Create New User @@ -156,4 +159,10 @@ * + + Enter Subscriber Number + + + * + \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/App_LocalResources/OrganizationHome.ascx.resx b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/App_LocalResources/OrganizationHome.ascx.resx index 23cd8d32..9c8ad7bf 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/App_LocalResources/OrganizationHome.ascx.resx +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/App_LocalResources/OrganizationHome.ascx.resx @@ -112,57 +112,16 @@ 2.0 - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 <p>Welcome to the organization home page!</p> - <p>Using the left menu you can manage organization domain names and users.</p> - <p>Organization statistics displays current status of the organization.</p> - - Allocated Diskspace (MB) - - - Contacts: - - - Domain Names: - - - Public Folders: - - - Distribution Lists: - - - Mailboxes: - - - Site Collections: - - - Used Diskspace (MB) - - - Users: - - - Organization Statistics - - - Home - - - Home - - - Unlimited - Created: @@ -172,22 +131,82 @@ Organization Name: - - CRM Users: - Total Used Disk Space, MB: Used Disk Space, MB: + + Allocated Diskspace (MB) + + + BlackBerry Users: + + + Contacts: + + + CRM Users: + + + Domain Names: + + + Storage (Mb): + + + Public Folders: + + + Distribution Lists: + + + Users: + + + Mailboxes: + + + OCS Users: + + + Site Collections: + + + Used Diskspace (MB) + + + Users: + + + BlackBerry + CRM Exchange + + Organization + + + Lync + + + OCS + SharePoint + + Home + + + Home + + + Unlimited + \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/App_LocalResources/OrganizationUserGeneralSettings.ascx.resx b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/App_LocalResources/OrganizationUserGeneralSettings.ascx.resx index 9f22134d..a1a54a1d 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/App_LocalResources/OrganizationUserGeneralSettings.ascx.resx +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/App_LocalResources/OrganizationUserGeneralSettings.ascx.resx @@ -112,10 +112,10 @@ 2.0 - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 ShowProgressDialog('Updating user settings...'); @@ -126,11 +126,15 @@ Disable User + + Account is locked out + + + Set Password + <p><b>Display Name</b> is a “friendly” name used by other programs, such as Microsoft Exchange or SharePoint.</p> - <p>Make sure your password is strong enough, i.e. contains lower and capital letters, numbers and symbols.</p> - <p>You can specify manager account to build organizational structure of your company.</p> @@ -154,6 +158,9 @@ Display Name: * + + External e-mail: + Fax: @@ -193,6 +200,9 @@ State/Province: + + Subscriber Number: + Edit User @@ -226,10 +236,4 @@ * - - External e-mail: - - - Account is locked out - \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/App_LocalResources/OrganizationUserSetupInstructions.ascx.resx b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/App_LocalResources/OrganizationUserSetupInstructions.ascx.resx index 720d3d30..d59541dc 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/App_LocalResources/OrganizationUserSetupInstructions.ascx.resx +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/App_LocalResources/OrganizationUserSetupInstructions.ascx.resx @@ -112,10 +112,10 @@ 2.0 - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Send diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/App_LocalResources/OrganizationUsers.ascx.resx b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/App_LocalResources/OrganizationUsers.ascx.resx index 9a097cd4..65ed352a 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/App_LocalResources/OrganizationUsers.ascx.resx +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/App_LocalResources/OrganizationUsers.ascx.resx @@ -112,10 +112,10 @@ 2.0 - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Create New User @@ -132,12 +132,21 @@ Search + + Domain Account + Display Name E-mail Address + + Subscriber Number + + + Subscriber + No users have been created. To create a new user click "Create New Users" button. @@ -149,14 +158,11 @@ <p>Active Directory user accounts are used to:</p> - <p>• Authenticate the identity of a user.<br> • Authorize or deny access to domain resources.<br> • Administer other security principals.<br> • Audit actions performed using the user account.</p> - <p>Primary E-Mail Address is a User Principal Name (UPN). It is used as a logon name in Outlook, Outlook Web Access (OWA) or SharePoint.</p> - <p>User account can also represent Exchange mailbox, which may be a person, room or inventory unit.</p> @@ -168,7 +174,4 @@ Users - - Domain Account - \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/App_LocalResources/Organizations.ascx.resx b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/App_LocalResources/Organizations.ascx.resx index db039cae..f87c9b7d 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/App_LocalResources/Organizations.ascx.resx +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/App_LocalResources/Organizations.ascx.resx @@ -112,10 +112,10 @@ 2.0 - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Create New Organization @@ -158,10 +158,8 @@ <p><b>Organization</b> is a group of Active Directory users, contacts and groups.<br><br> - All accounts within one organization are located in the same Organizational Unit and are not visible to members of other organizations.<br><br> - -Exchange-enabled organization has its own Global Address List (GAL) and Offline Address Book (OAB). Mailboxes, contacts, distribution lists and public folders of Exchange-enabled organization share the same GAL and OAB</p> +Exchange-enabled organization has its own Global Address List (GAL) and Offline Address Book (OAB). Mailboxes, contacts, and distribution lists of Exchange-enabled organization share the same GAL and OAB</p> Total Organizations Created: diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeActiveSyncSettings.ascx b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeActiveSyncSettings.ascx index b8146635..2a208153 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeActiveSyncSettings.ascx +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeActiveSyncSettings.ascx @@ -59,7 +59,7 @@ - + @@ -137,7 +137,7 @@ - + @@ -146,7 +146,7 @@ meta:resourcekey="locMinimumPasswordLength" Text="Minimum password length:"> + DisplayUnits="false" EmptyValue="0" DisplayUnitsKB="false" DisplayUnitsMB="false" DisplayUnitsPct="false"/> @@ -154,7 +154,7 @@ - + @@ -164,7 +164,7 @@ - + @@ -174,7 +174,7 @@ - + diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeActiveSyncSettings.ascx.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeActiveSyncSettings.ascx.cs index cd2eb6c5..97c58b86 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeActiveSyncSettings.ascx.cs +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeActiveSyncSettings.ascx.cs @@ -28,6 +28,7 @@ using System; using WebsitePanel.Providers.HostedSolution; +using WebsitePanel.EnterpriseServer; namespace WebsitePanel.Portal.ExchangeServer { @@ -39,6 +40,9 @@ namespace WebsitePanel.Portal.ExchangeServer { BindPolicy(); } + + + } protected void btnSave_Click(object sender, EventArgs e) @@ -55,7 +59,7 @@ namespace WebsitePanel.Portal.ExchangeServer // bind data chkAllowNonProvisionable.Checked = policy.AllowNonProvisionableDevices; - + chkAllowAttachments.Checked = policy.AttachmentsEnabled; sizeMaxAttachmentSize.ValueKB = policy.MaxAttachmentSizeKB; diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeActiveSyncSettings.ascx.designer.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeActiveSyncSettings.ascx.designer.cs index 6e6cf679..3f3f65cd 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeActiveSyncSettings.ascx.designer.cs +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeActiveSyncSettings.ascx.designer.cs @@ -1,22 +1,15 @@ //------------------------------------------------------------------------------ // // This code was generated by a tool. -// Runtime Version:2.0.50727.832 // // Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. +// the code is regenerated. // //------------------------------------------------------------------------------ namespace WebsitePanel.Portal.ExchangeServer { - /// - /// ExchangeActiveSyncSettings class. - /// - /// - /// Auto-generated class. - /// public partial class ExchangeActiveSyncSettings { /// diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeAddDomainName.ascx b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeAddDomainName.ascx index 364ba693..39484d06 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeAddDomainName.ascx +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeAddDomainName.ascx @@ -26,12 +26,7 @@ - - - * + @@ -39,6 +34,7 @@
    +
    diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeAddDomainName.ascx.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeAddDomainName.ascx.cs index 29c5a9a5..a6d9c55c 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeAddDomainName.ascx.cs +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeAddDomainName.ascx.cs @@ -27,21 +27,55 @@ // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. using System; +using WebsitePanel.EnterpriseServer; +using WebsitePanel.Providers.HostedSolution; namespace WebsitePanel.Portal.ExchangeServer { - public partial class ExchangeAddDomainName : WebsitePanelModuleBase - { - protected void Page_Load(object sender, EventArgs e) - { + public partial class ExchangeAddDomainName : WebsitePanelModuleBase + { + protected void Page_Load(object sender, EventArgs e) + { + DomainInfo[] domains = ES.Services.Servers.GetMyDomains(PanelSecurity.PackageId); - } + OrganizationDomainName[] list = ES.Services.Organizations.GetOrganizationDomains(PanelRequest.ItemID); + + foreach (DomainInfo d in domains) + { + if (!d.IsDomainPointer & !d.IsInstantAlias) + { + bool bAdd = true; + foreach (OrganizationDomainName acceptedDomain in list) + { + if (d.DomainName.ToLower() == acceptedDomain.DomainName.ToLower()) + { + bAdd = false; + break; + } + + } + if (bAdd) ddlDomains.Items.Add(d.DomainName.ToLower()); + } + } + + if (ddlDomains.Items.Count == 0) btnAdd.Enabled = false; + + + + } protected void btnAdd_Click(object sender, EventArgs e) { AddDomain(); } + protected void btnCancel_Click(object sender, EventArgs e) + { + Response.Redirect(EditUrl("ItemID", PanelRequest.ItemID.ToString(), "domains", "SpaceID=" + PanelSecurity.PackageId)); + + } + + private void AddDomain() { if (!Page.IsValid) @@ -51,7 +85,7 @@ namespace WebsitePanel.Portal.ExchangeServer { int result = ES.Services.Organizations.AddOrganizationDomain(PanelRequest.ItemID, - txtDomainName.Text.Trim()); + ddlDomains.SelectedValue.Trim()); if (result < 0) { @@ -67,5 +101,5 @@ namespace WebsitePanel.Portal.ExchangeServer messageBox.ShowErrorMessage("EXCHANGE_ADD_DOMAIN", ex); } } - } + } } \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeAddDomainName.ascx.designer.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeAddDomainName.ascx.designer.cs index b0444dc0..911a13b7 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeAddDomainName.ascx.designer.cs +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeAddDomainName.ascx.designer.cs @@ -76,31 +76,13 @@ namespace WebsitePanel.Portal.ExchangeServer { protected global::System.Web.UI.WebControls.Localize locDomainName; /// - /// txtDomainName control. + /// ddlDomains control. /// /// /// Auto-generated field. /// To modify move field declaration from designer file to code-behind file. /// - protected global::System.Web.UI.WebControls.TextBox txtDomainName; - - /// - /// valRequireDomainName control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.RequiredFieldValidator valRequireDomainName; - - /// - /// valRequireCorrectDomain control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.RegularExpressionValidator valRequireCorrectDomain; + protected global::System.Web.UI.WebControls.DropDownList ddlDomains; /// /// btnAdd control. @@ -120,6 +102,15 @@ namespace WebsitePanel.Portal.ExchangeServer { /// protected global::System.Web.UI.WebControls.ValidationSummary ValidationSummary1; + /// + /// btnCancel control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Button btnCancel; + /// /// FormComments control. /// diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeMailboxAdvancedSettings.ascx b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeAddMailboxPlan.ascx similarity index 54% rename from WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeMailboxAdvancedSettings.ascx rename to WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeAddMailboxPlan.ascx index a2fb4232..7ca424b7 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeMailboxAdvancedSettings.ascx +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeAddMailboxPlan.ascx @@ -1,11 +1,10 @@ -<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="ExchangeMailboxAdvancedSettings.ascx.cs" Inherits="WebsitePanel.Portal.ExchangeServer.ExchangeMailboxAdvancedSettings" %> +<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="ExchangeAddMailboxPlan.ascx.cs" Inherits="WebsitePanel.Portal.ExchangeServer.ExchangeAddMailboxPlan" %> <%@ Register Src="../UserControls/SimpleMessageBox.ascx" TagName="SimpleMessageBox" TagPrefix="wsp" %> -<%@ Register Src="UserControls/MailboxTabs.ascx" TagName="MailboxTabs" TagPrefix="wsp" %> <%@ Register Src="UserControls/Menu.ascx" TagName="Menu" TagPrefix="wsp" %> +<%@ Register Src="UserControls/Breadcrumb.ascx" TagName="Breadcrumb" TagPrefix="wsp" %> <%@ Register Src="UserControls/SizeBox.ascx" TagName="SizeBox" TagPrefix="wsp" %> <%@ Register Src="UserControls/DaysBox.ascx" TagName="DaysBox" TagPrefix="wsp" %> -<%@ Register Src="UserControls/Breadcrumb.ascx" TagName="Breadcrumb" TagPrefix="wsp" %> -<%@ Register TagPrefix="wsp" TagName="CollapsiblePanel" Src="../UserControls/CollapsiblePanel.ascx" %> +<%@ Register Src="../UserControls/CollapsiblePanel.ascx" TagName="CollapsiblePanel" TagPrefix="wsp" %> <%@ Register Src="../UserControls/EnableAsyncTasksSupport.ascx" TagName="EnableAsyncTasksSupport" TagPrefix="wsp" %> @@ -16,19 +15,35 @@
    - +
    - - - - - -
    + + +
    - - + + + + + + + + + + +
    + + + + +
    +
    +
    @@ -63,66 +78,70 @@
    - - - + + - - - - + +
    + - - - - - - - - - - - - - +
    - 177 +
    - 16 -
    - -
    - -

    - - + + + + + + + + + + + + + + + + + +
    + +
    + +
    + +
    + +
    - +
    - +
    - +
    @@ -138,44 +157,17 @@ - +
    - - - - - - - - - - -
    - - - -
    -
    -
    - - - - - -
    - -
    - + +
    - - + +
    diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeAddMailboxPlan.ascx.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeAddMailboxPlan.ascx.cs new file mode 100644 index 00000000..2237914d --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeAddMailboxPlan.ascx.cs @@ -0,0 +1,192 @@ +// Copyright (c) 2011, Outercurve Foundation. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// - Redistributions of source code must retain the above copyright notice, this +// list of conditions and the following disclaimer. +// +// - Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// - Neither the name of the Outercurve Foundation nor the names of its +// contributors may be used to endorse or promote products derived from this +// software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +using System; +using WebsitePanel.EnterpriseServer; +using WebsitePanel.Providers.HostedSolution; +using WebsitePanel.Providers.ResultObjects; + +namespace WebsitePanel.Portal.ExchangeServer +{ + public partial class ExchangeAddMailboxPlan : WebsitePanelModuleBase + { + protected void Page_Load(object sender, EventArgs e) + { + + if (!IsPostBack) + { + if (PanelRequest.GetInt("MailboxPlanId") != 0) + { + Providers.HostedSolution.ExchangeMailboxPlan plan = ES.Services.ExchangeServer.GetExchangeMailboxPlan(PanelRequest.ItemID, PanelRequest.GetInt("MailboxPlanId")); + txtMailboxPlan.Text = plan.MailboxPlan; + mailboxSize.ValueKB = plan.MailboxSizeMB; + maxRecipients.ValueKB = plan.MaxRecipients; + maxSendMessageSizeKB.ValueKB = plan.MaxSendMessageSizeKB; + maxReceiveMessageSizeKB.ValueKB = plan.MaxReceiveMessageSizeKB; + chkPOP3.Checked = plan.EnablePOP; + chkIMAP.Checked = plan.EnableIMAP; + chkOWA.Checked = plan.EnableOWA; + chkMAPI.Checked = plan.EnableMAPI; + chkActiveSync.Checked = plan.EnableActiveSync; + sizeIssueWarning.ValueKB = plan.IssueWarningPct; + sizeProhibitSend.ValueKB = plan.ProhibitSendPct; + sizeProhibitSendReceive.ValueKB = plan.ProhibitSendReceivePct; + daysKeepDeletedItems.ValueDays = plan.KeepDeletedItemsDays; + chkHideFromAddressBook.Checked = plan.HideFromAddressBook; + + /* + txtMailboxPlan.Enabled = false; + mailboxSize.Enabled = false; + maxRecipients.Enabled = false; + maxSendMessageSizeKB.Enabled = false; + maxReceiveMessageSizeKB.Enabled = false; + chkPOP3.Enabled = false; + chkIMAP.Enabled = false; + chkOWA.Enabled = false; + chkMAPI.Enabled = false; + chkActiveSync.Enabled = false; + sizeIssueWarning.Enabled = false; + sizeProhibitSend.Enabled = false; + sizeProhibitSendReceive.Enabled = false; + daysKeepDeletedItems.Enabled = false; + chkHideFromAddressBook.Enabled = false; + + btnAdd.Enabled = false; + */ + + locTitle.Text = plan.MailboxPlan; + this.DisableControls = true; + + } + else + { + PackageContext cntx = ES.Services.Packages.GetPackageContext(PanelSecurity.PackageId); + if (cntx != null) + { + foreach (QuotaValueInfo quota in cntx.QuotasArray) + { + switch (quota.QuotaId) + { + case 365: + maxRecipients.ValueKB = quota.QuotaAllocatedValue; + break; + case 366: + maxSendMessageSizeKB.ValueKB = quota.QuotaAllocatedValue; + break; + case 367: + maxReceiveMessageSizeKB.ValueKB = quota.QuotaAllocatedValue; + break; + case 83: + chkPOP3.Checked = Convert.ToBoolean(quota.QuotaAllocatedValue); + chkPOP3.Enabled = Convert.ToBoolean(quota.QuotaAllocatedValue); + break; + case 84: + chkIMAP.Checked = Convert.ToBoolean(quota.QuotaAllocatedValue); + chkIMAP.Enabled = Convert.ToBoolean(quota.QuotaAllocatedValue); + break; + case 85: + chkOWA.Checked = Convert.ToBoolean(quota.QuotaAllocatedValue); + chkOWA.Enabled = Convert.ToBoolean(quota.QuotaAllocatedValue); + break; + case 86: + chkMAPI.Checked = Convert.ToBoolean(quota.QuotaAllocatedValue); + chkMAPI.Enabled = Convert.ToBoolean(quota.QuotaAllocatedValue); + break; + case 87: + chkActiveSync.Checked = Convert.ToBoolean(quota.QuotaAllocatedValue); + chkActiveSync.Enabled = Convert.ToBoolean(quota.QuotaAllocatedValue); + break; + case 364: + daysKeepDeletedItems.ValueDays = quota.QuotaAllocatedValue; + break; + } + + sizeIssueWarning.ValueKB = 100; + sizeProhibitSend.ValueKB = 100; + sizeProhibitSendReceive.ValueKB = 100; + } + } + else + this.DisableControls = true; + } + } + + } + + protected void btnAdd_Click(object sender, EventArgs e) + { + AddMailboxPlan(); + } + + private void AddMailboxPlan() + { + try + { + Providers.HostedSolution.ExchangeMailboxPlan plan = new Providers.HostedSolution.ExchangeMailboxPlan(); + plan.MailboxPlan = txtMailboxPlan.Text; + plan.MailboxSizeMB = mailboxSize.ValueKB; + if ((plan.MailboxSizeMB == 0)) plan.MailboxSizeMB = 1; + + plan.IsDefault = false; + plan.MaxRecipients = maxRecipients.ValueKB; + plan.MaxSendMessageSizeKB = maxSendMessageSizeKB.ValueKB; + plan.MaxReceiveMessageSizeKB = maxReceiveMessageSizeKB.ValueKB; + plan.EnablePOP = chkPOP3.Checked; + plan.EnableIMAP = chkIMAP.Checked; + plan.EnableOWA = chkOWA.Checked; + plan.EnableMAPI = chkMAPI.Checked; + plan.EnableActiveSync = chkActiveSync.Checked; + plan.IssueWarningPct = sizeIssueWarning.ValueKB; + if ((plan.IssueWarningPct == 0)) plan.IssueWarningPct = 100; + plan.ProhibitSendPct = sizeProhibitSend.ValueKB; + if ((plan.ProhibitSendPct == 0)) plan.ProhibitSendPct = 100; + plan.ProhibitSendReceivePct = sizeProhibitSendReceive.ValueKB; + if ((plan.ProhibitSendReceivePct == 0)) plan.ProhibitSendReceivePct = 100; + plan.KeepDeletedItemsDays = daysKeepDeletedItems.ValueDays; + plan.HideFromAddressBook = chkHideFromAddressBook.Checked; + + int result = ES.Services.ExchangeServer.AddExchangeMailboxPlan(PanelRequest.ItemID, + plan); + + + if (result < 0) + { + messageBox.ShowResultMessage(result); + return; + } + + Response.Redirect(EditUrl("ItemID", PanelRequest.ItemID.ToString(), "mailboxplans", + "SpaceID=" + PanelSecurity.PackageId)); + } + catch (Exception ex) + { + messageBox.ShowErrorMessage("EXCHANGE_ADD_MAILBOXPLAN", ex); + } + } + } +} \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeMailboxAdvancedSettings.ascx.designer.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeAddMailboxPlan.ascx.designer.cs similarity index 86% rename from WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeMailboxAdvancedSettings.ascx.designer.cs rename to WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeAddMailboxPlan.ascx.designer.cs index aad359ab..7a1b7b1d 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeMailboxAdvancedSettings.ascx.designer.cs +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeAddMailboxPlan.ascx.designer.cs @@ -1,17 +1,16 @@ -//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ // // This code was generated by a tool. -// Runtime Version:2.0.50727.1433 // // Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. +// the code is regenerated. // //------------------------------------------------------------------------------ namespace WebsitePanel.Portal.ExchangeServer { - public partial class ExchangeMailboxAdvancedSettings { + public partial class ExchangeAddMailboxPlan { /// /// asyncTasks control. @@ -58,24 +57,6 @@ namespace WebsitePanel.Portal.ExchangeServer { /// protected global::System.Web.UI.WebControls.Localize locTitle; - /// - /// litDisplayName control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.Literal litDisplayName; - - /// - /// tabs control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::WebsitePanel.Portal.ExchangeServer.UserControls.MailboxTabs tabs; - /// /// messageBox control. /// @@ -85,6 +66,42 @@ namespace WebsitePanel.Portal.ExchangeServer { /// protected global::WebsitePanel.Portal.UserControls.SimpleMessageBox messageBox; + /// + /// secMailboxPlan control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.CollapsiblePanel secMailboxPlan; + + /// + /// MailboxPlan control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Panel MailboxPlan; + + /// + /// txtMailboxPlan control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.TextBox txtMailboxPlan; + + /// + /// valRequireMailboxPlan control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.RequiredFieldValidator valRequireMailboxPlan; + /// /// secMailboxFeatures control. /// @@ -149,94 +166,31 @@ namespace WebsitePanel.Portal.ExchangeServer { protected global::System.Web.UI.WebControls.CheckBox chkActiveSync; /// - /// secStatistics control. + /// secMailboxGeneral control. /// /// /// Auto-generated field. /// To modify move field declaration from designer file to code-behind file. /// - protected global::WebsitePanel.Portal.CollapsiblePanel secStatistics; + protected global::WebsitePanel.Portal.CollapsiblePanel secMailboxGeneral; /// - /// Statistics control. + /// MailboxGeneral control. /// /// /// Auto-generated field. /// To modify move field declaration from designer file to code-behind file. /// - protected global::System.Web.UI.WebControls.Panel Statistics; + protected global::System.Web.UI.WebControls.Panel MailboxGeneral; /// - /// locTotalItems control. + /// chkHideFromAddressBook control. /// /// /// Auto-generated field. /// To modify move field declaration from designer file to code-behind file. /// - protected global::System.Web.UI.WebControls.Localize locTotalItems; - - /// - /// lblTotalItems control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.Label lblTotalItems; - - /// - /// locTotalSize control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.Localize locTotalSize; - - /// - /// lblTotalSize control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.Label lblTotalSize; - - /// - /// locLastLogon control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.Localize locLastLogon; - - /// - /// lblLastLogon control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.Label lblLastLogon; - - /// - /// locLastLogoff control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.Localize locLastLogoff; - - /// - /// lblLastLogoff control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.Label lblLastLogoff; + protected global::System.Web.UI.WebControls.CheckBox chkHideFromAddressBook; /// /// secStorageQuotas control. @@ -256,6 +210,78 @@ namespace WebsitePanel.Portal.ExchangeServer { /// protected global::System.Web.UI.WebControls.Panel StorageQuotas; + /// + /// locMailboxSize control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Localize locMailboxSize; + + /// + /// mailboxSize control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.ExchangeServer.UserControls.SizeBox mailboxSize; + + /// + /// locMaxRecipients control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Localize locMaxRecipients; + + /// + /// maxRecipients control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.ExchangeServer.UserControls.SizeBox maxRecipients; + + /// + /// locMaxSendMessageSizeKB control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Localize locMaxSendMessageSizeKB; + + /// + /// maxSendMessageSizeKB control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.ExchangeServer.UserControls.SizeBox maxSendMessageSizeKB; + + /// + /// locMaxReceiveMessageSizeKB control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Localize locMaxReceiveMessageSizeKB; + + /// + /// maxReceiveMessageSizeKB control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.ExchangeServer.UserControls.SizeBox maxReceiveMessageSizeKB; + /// /// locWhenSizeExceeds control. /// @@ -356,49 +382,13 @@ namespace WebsitePanel.Portal.ExchangeServer { protected global::WebsitePanel.Portal.ExchangeServer.UserControls.DaysBox daysKeepDeletedItems; /// - /// secDomainUser control. + /// btnAdd control. /// /// /// Auto-generated field. /// To modify move field declaration from designer file to code-behind file. /// - protected global::WebsitePanel.Portal.CollapsiblePanel secDomainUser; - - /// - /// DomainUser control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.Panel DomainUser; - - /// - /// txtAccountName control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.TextBox txtAccountName; - - /// - /// chkPmmAllowed control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.CheckBox chkPmmAllowed; - - /// - /// btnSave control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.Button btnSave; + protected global::System.Web.UI.WebControls.Button btnAdd; /// /// ValidationSummary1 control. diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeContactGeneralSettings.ascx.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeContactGeneralSettings.ascx.cs index f0b2c7ba..3237f9b2 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeContactGeneralSettings.ascx.cs +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeContactGeneralSettings.ascx.cs @@ -30,19 +30,22 @@ using System; using System.Web.UI.WebControls; using WebsitePanel.Providers.HostedSolution; using Microsoft.Security.Application; +using WebsitePanel.EnterpriseServer; namespace WebsitePanel.Portal.ExchangeServer { - public partial class ExchangeContactGeneralSettings : WebsitePanelModuleBase - { - protected void Page_Load(object sender, EventArgs e) - { + public partial class ExchangeContactGeneralSettings : WebsitePanelModuleBase + { + protected void Page_Load(object sender, EventArgs e) + { if (!IsPostBack) { BindMapiRichTextFormat(); BindSettings(); } - } + + + } private void BindMapiRichTextFormat() { @@ -60,8 +63,8 @@ namespace WebsitePanel.Portal.ExchangeServer // get settings ExchangeContact contact = ES.Services.ExchangeServer.GetContactGeneralSettings(PanelRequest.ItemID, PanelRequest.AccountID); - - litDisplayName.Text = AntiXss.HtmlEncode(contact.DisplayName); + + litDisplayName.Text = AntiXss.HtmlEncode(contact.DisplayName); // bind form txtDisplayName.Text = contact.DisplayName; @@ -95,7 +98,7 @@ namespace WebsitePanel.Portal.ExchangeServer } catch (Exception ex) { - messageBox.ShowErrorMessage("EXCHANGE_GET_CONTACT_SETTINGS", ex); + messageBox.ShowErrorMessage("EXCHANGE_GET_CONTACT_SETTINGS", ex); } } @@ -143,13 +146,13 @@ namespace WebsitePanel.Portal.ExchangeServer return; } - litDisplayName.Text = AntiXss.HtmlEncode(txtDisplayName.Text); + litDisplayName.Text = AntiXss.HtmlEncode(txtDisplayName.Text); - messageBox.ShowSuccessMessage("EXCHANGE_UPDATE_CONTACT_SETTINGS"); + messageBox.ShowSuccessMessage("EXCHANGE_UPDATE_CONTACT_SETTINGS"); } catch (Exception ex) { - messageBox.ShowErrorMessage("EXCHANGE_UPDATE_CONTACT_SETTINGS", ex); + messageBox.ShowErrorMessage("EXCHANGE_UPDATE_CONTACT_SETTINGS", ex); } } @@ -157,5 +160,5 @@ namespace WebsitePanel.Portal.ExchangeServer { SaveSettings(); } - } + } } \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeContactGeneralSettings.ascx.designer.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeContactGeneralSettings.ascx.designer.cs index d7b1be03..6186bb22 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeContactGeneralSettings.ascx.designer.cs +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeContactGeneralSettings.ascx.designer.cs @@ -1,22 +1,15 @@ //------------------------------------------------------------------------------ // // This code was generated by a tool. -// Runtime Version:2.0.50727.1433 // // Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. +// the code is regenerated. // //------------------------------------------------------------------------------ namespace WebsitePanel.Portal.ExchangeServer { - /// - /// ExchangeContactGeneralSettings class. - /// - /// - /// Auto-generated class. - /// public partial class ExchangeContactGeneralSettings { /// diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeContactMailFlowSettings.ascx.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeContactMailFlowSettings.ascx.cs index 03e37b08..ae256765 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeContactMailFlowSettings.ascx.cs +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeContactMailFlowSettings.ascx.cs @@ -38,17 +38,20 @@ using System.Web.UI.WebControls.WebParts; using System.Web.UI.HtmlControls; using WebsitePanel.Providers.HostedSolution; +using WebsitePanel.EnterpriseServer; namespace WebsitePanel.Portal.ExchangeServer { - public partial class ExchangeContactMailFlowSettings : WebsitePanelModuleBase - { + public partial class ExchangeContactMailFlowSettings : WebsitePanelModuleBase + { protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { BindSettings(); } + + } private void BindSettings() @@ -59,12 +62,12 @@ namespace WebsitePanel.Portal.ExchangeServer ExchangeContact contact = ES.Services.ExchangeServer.GetContactMailFlowSettings( PanelRequest.ItemID, PanelRequest.AccountID); - litDisplayName.Text = contact.DisplayName; + litDisplayName.Text = contact.DisplayName; // bind form acceptAccounts.SetAccounts(contact.AcceptAccounts); chkSendersAuthenticated.Checked = contact.RequireSenderAuthentication; - rejectAccounts.SetAccounts(contact.RejectAccounts); + rejectAccounts.SetAccounts(contact.RejectAccounts); } catch (Exception ex) { @@ -92,11 +95,11 @@ namespace WebsitePanel.Portal.ExchangeServer return; } - messageBox.ShowSuccessMessage("EXCHANGE_UPDATE_CONTACT_MAILFLOW"); + messageBox.ShowSuccessMessage("EXCHANGE_UPDATE_CONTACT_MAILFLOW"); } catch (Exception ex) { - messageBox.ShowErrorMessage("EXCHANGE_UPDATE_CONTACT_MAILFLOW", ex); + messageBox.ShowErrorMessage("EXCHANGE_UPDATE_CONTACT_MAILFLOW", ex); } } @@ -104,5 +107,5 @@ namespace WebsitePanel.Portal.ExchangeServer { SaveSettings(); } - } + } } \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeContactMailFlowSettings.ascx.designer.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeContactMailFlowSettings.ascx.designer.cs index ae203ff7..51e80b4a 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeContactMailFlowSettings.ascx.designer.cs +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeContactMailFlowSettings.ascx.designer.cs @@ -1,22 +1,15 @@ //------------------------------------------------------------------------------ // // This code was generated by a tool. -// Runtime Version:2.0.50727.312 // // Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. +// the code is regenerated. // //------------------------------------------------------------------------------ namespace WebsitePanel.Portal.ExchangeServer { - /// - /// ExchangeContactMailFlowSettings class. - /// - /// - /// Auto-generated class. - /// public partial class ExchangeContactMailFlowSettings { /// diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeContacts.ascx b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeContacts.ascx index 85248ff5..edd7473c 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeContacts.ascx +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeContacts.ascx @@ -32,13 +32,6 @@
    - - 10 - 20 - 50 - 100 - DisplayName Email @@ -51,7 +44,7 @@ + DataSourceID="odsAccountsPaged"> diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeContacts.ascx.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeContacts.ascx.cs index f50647e5..9937409f 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeContacts.ascx.cs +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeContacts.ascx.cs @@ -38,49 +38,52 @@ using System.Web.UI.WebControls.WebParts; using System.Web.UI.HtmlControls; using WebsitePanel.Providers.HostedSolution; +using WebsitePanel.EnterpriseServer; namespace WebsitePanel.Portal.ExchangeServer { - public partial class ExchangeContacts : WebsitePanelModuleBase - { - protected void Page_Load(object sender, EventArgs e) - { - if (!IsPostBack) - { - BindStats(); - } - } + public partial class ExchangeContacts : WebsitePanelModuleBase + { + protected void Page_Load(object sender, EventArgs e) + { + if (!IsPostBack) + { + BindStats(); + } - private void BindStats() - { - // quota values - OrganizationStatistics stats = - ES.Services.ExchangeServer.GetOrganizationStatistics(PanelRequest.ItemID); - contactsQuota.QuotaUsedValue = stats.CreatedContacts; - contactsQuota.QuotaValue = stats.AllocatedContacts; - } + + } - protected void btnCreateContact_Click(object sender, EventArgs e) - { - Response.Redirect(EditUrl("ItemID", PanelRequest.ItemID.ToString(), "create_contact", - "SpaceID=" + PanelSecurity.PackageId.ToString())); - } + private void BindStats() + { + // quota values + OrganizationStatistics stats = + ES.Services.ExchangeServer.GetOrganizationStatistics(PanelRequest.ItemID); + contactsQuota.QuotaUsedValue = stats.CreatedContacts; + contactsQuota.QuotaValue = stats.AllocatedContacts; + } - public string GetContactEditUrl(string accountId) - { - return EditUrl("SpaceID", PanelSecurity.PackageId.ToString(), "contact_settings", - "AccountID=" + accountId, - "ItemID=" + PanelRequest.ItemID.ToString()); - } + protected void btnCreateContact_Click(object sender, EventArgs e) + { + Response.Redirect(EditUrl("ItemID", PanelRequest.ItemID.ToString(), "create_contact", + "SpaceID=" + PanelSecurity.PackageId.ToString())); + } - protected void odsAccountsPaged_Selected(object sender, ObjectDataSourceStatusEventArgs e) - { - if (e.Exception != null) - { - messageBox.ShowErrorMessage("EXCHANGE_GET_CONTACTS", e.Exception); - e.ExceptionHandled = true; - } - } + public string GetContactEditUrl(string accountId) + { + return EditUrl("SpaceID", PanelSecurity.PackageId.ToString(), "contact_settings", + "AccountID=" + accountId, + "ItemID=" + PanelRequest.ItemID.ToString()); + } + + protected void odsAccountsPaged_Selected(object sender, ObjectDataSourceStatusEventArgs e) + { + if (e.Exception != null) + { + messageBox.ShowErrorMessage("EXCHANGE_GET_CONTACTS", e.Exception); + e.ExceptionHandled = true; + } + } protected void gvContacts_RowCommand(object sender, GridViewCommandEventArgs e) { @@ -101,25 +104,13 @@ namespace WebsitePanel.Portal.ExchangeServer // rebind grid gvContacts.DataBind(); - BindStats(); + BindStats(); } catch (Exception ex) { - messageBox.ShowErrorMessage("EXCHANGE_DELETE_CONTACT", ex); + messageBox.ShowErrorMessage("EXCHANGE_DELETE_CONTACT", ex); } } } - - protected void ddlPageSize_SelectedIndexChanged(object sender, EventArgs e) - { - gvContacts.PageSize = Convert.ToInt16(ddlPageSize.SelectedValue); - - // rebind grid - gvContacts.DataBind(); - - // bind stats - BindStats(); - - } - } + } } \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeContacts.ascx.designer.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeContacts.ascx.designer.cs index 8a00f9e7..70d6ca5f 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeContacts.ascx.designer.cs +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeContacts.ascx.designer.cs @@ -93,15 +93,6 @@ namespace WebsitePanel.Portal.ExchangeServer { /// protected global::System.Web.UI.WebControls.Localize locSearch; - /// - /// ddlPageSize control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.DropDownList ddlPageSize; - /// /// ddlSearchColumn control. /// diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeCreateContact.ascx.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeCreateContact.ascx.cs index f09dd359..6bdc0eaf 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeCreateContact.ascx.cs +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeCreateContact.ascx.cs @@ -40,12 +40,12 @@ using WebsitePanel.EnterpriseServer; namespace WebsitePanel.Portal.ExchangeServer { - public partial class ExchangeCreateContact : WebsitePanelModuleBase - { - protected void Page_Load(object sender, EventArgs e) - { - - } + public partial class ExchangeCreateContact : WebsitePanelModuleBase + { + protected void Page_Load(object sender, EventArgs e) + { + + } protected void btnCreate_Click(object sender, EventArgs e) { @@ -68,7 +68,7 @@ namespace WebsitePanel.Portal.ExchangeServer { messageBox.ShowResultMessage(BusinessErrorCodes.ERROR_EXCHANGE_EMAIL_EXISTS); return; - + } if (accountId < 0) @@ -86,5 +86,5 @@ namespace WebsitePanel.Portal.ExchangeServer messageBox.ShowErrorMessage("EXCHANGE_CREATE_CONTACT", ex); } } - } + } } \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeCreateContact.ascx.designer.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeCreateContact.ascx.designer.cs index 58a987b9..3f35f26b 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeCreateContact.ascx.designer.cs +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeCreateContact.ascx.designer.cs @@ -1,31 +1,159 @@ //------------------------------------------------------------------------------ // // This code was generated by a tool. -// Runtime Version:2.0.50727.42 // // Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. +// the code is regenerated. // //------------------------------------------------------------------------------ namespace WebsitePanel.Portal.ExchangeServer { + public partial class ExchangeCreateContact { - protected WebsitePanel.Portal.EnableAsyncTasksSupport asyncTasks; - protected WebsitePanel.Portal.ExchangeServer.UserControls.Breadcrumb breadcrumb; - protected WebsitePanel.Portal.ExchangeServer.UserControls.Menu menu; - protected System.Web.UI.WebControls.Image Image1; - protected System.Web.UI.WebControls.Localize locTitle; - protected WebsitePanel.Portal.UserControls.SimpleMessageBox messageBox; - protected System.Web.UI.WebControls.Localize locDisplayName; - protected System.Web.UI.WebControls.TextBox txtDisplayName; - protected System.Web.UI.WebControls.RequiredFieldValidator valRequireDisplayName; - protected System.Web.UI.WebControls.Localize locEmail; - protected System.Web.UI.WebControls.TextBox txtEmail; - protected System.Web.UI.WebControls.RequiredFieldValidator valRequireAccount; - protected System.Web.UI.WebControls.RegularExpressionValidator valCorrectEmail; - protected System.Web.UI.WebControls.Button btnCreate; - protected System.Web.UI.WebControls.ValidationSummary ValidationSummary1; - protected System.Web.UI.WebControls.Localize FormComments; + + /// + /// asyncTasks control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.EnableAsyncTasksSupport asyncTasks; + + /// + /// breadcrumb control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.ExchangeServer.UserControls.Breadcrumb breadcrumb; + + /// + /// menu control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.ExchangeServer.UserControls.Menu menu; + + /// + /// Image1 control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Image Image1; + + /// + /// locTitle control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Localize locTitle; + + /// + /// messageBox control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.UserControls.SimpleMessageBox messageBox; + + /// + /// locDisplayName control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Localize locDisplayName; + + /// + /// txtDisplayName control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.TextBox txtDisplayName; + + /// + /// valRequireDisplayName control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.RequiredFieldValidator valRequireDisplayName; + + /// + /// locEmail control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Localize locEmail; + + /// + /// txtEmail control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.TextBox txtEmail; + + /// + /// valRequireAccount control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.RequiredFieldValidator valRequireAccount; + + /// + /// valCorrectEmail control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.RegularExpressionValidator valCorrectEmail; + + /// + /// btnCreate control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Button btnCreate; + + /// + /// ValidationSummary1 control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.ValidationSummary ValidationSummary1; + + /// + /// FormComments control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Localize FormComments; } } diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeCreateDistributionList.ascx.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeCreateDistributionList.ascx.cs index 2de35495..99b92082 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeCreateDistributionList.ascx.cs +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeCreateDistributionList.ascx.cs @@ -36,15 +36,16 @@ using System.Web.UI; using System.Web.UI.WebControls; using System.Web.UI.WebControls.WebParts; using System.Web.UI.HtmlControls; +using WebsitePanel.EnterpriseServer; namespace WebsitePanel.Portal.ExchangeServer { - public partial class ExchangeCreateDistributionList : WebsitePanelModuleBase - { - protected void Page_Load(object sender, EventArgs e) - { - - } + public partial class ExchangeCreateDistributionList : WebsitePanelModuleBase + { + protected void Page_Load(object sender, EventArgs e) + { + + } protected void btnCreate_Click(object sender, EventArgs e) { @@ -56,7 +57,7 @@ namespace WebsitePanel.Portal.ExchangeServer if (!Page.IsValid) return; - + try { @@ -66,7 +67,7 @@ namespace WebsitePanel.Portal.ExchangeServer email.AccountName, email.DomainName, manager.GetAccountId()); - + if (accountId < 0) { @@ -90,6 +91,6 @@ namespace WebsitePanel.Portal.ExchangeServer } - - } + + } } \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeCreateDistributionList.ascx.designer.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeCreateDistributionList.ascx.designer.cs index 40d5eec3..6c1ccf4e 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeCreateDistributionList.ascx.designer.cs +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeCreateDistributionList.ascx.designer.cs @@ -1,10 +1,9 @@ //------------------------------------------------------------------------------ // // This code was generated by a tool. -// Runtime Version:2.0.50727.1873 // // Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. +// the code is regenerated. // //------------------------------------------------------------------------------ diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeCreateMailbox.ascx b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeCreateMailbox.ascx index b6a1e5f6..5cae78f8 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeCreateMailbox.ascx +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeCreateMailbox.ascx @@ -7,6 +7,7 @@ <%@ Register Src="UserControls/Menu.ascx" TagName="Menu" TagPrefix="wsp" %> <%@ Register Src="UserControls/Breadcrumb.ascx" TagName="Breadcrumb" TagPrefix="wsp" %> <%@ Register Src="../UserControls/EnableAsyncTasksSupport.ascx" TagName="EnableAsyncTasksSupport" TagPrefix="wsp" %> +<%@ Register Src="UserControls/MailboxPlanSelector.ascx" TagName="MailboxPlanSelector" TagPrefix="wsp" %> @@ -50,7 +51,7 @@ - + @@ -61,6 +62,14 @@ ErrorMessage="Enter Display Name" ValidationGroup="CreateMailbox" Display="Dynamic" Text="*" SetFocusOnError="True"> + + + + +
    + + +
    @@ -91,21 +100,23 @@
    - - - - - + + + +
    - -
    + + + +
    - +
    diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeCreateMailbox.ascx.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeCreateMailbox.ascx.cs index ab4da28a..359c7fe8 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeCreateMailbox.ascx.cs +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeCreateMailbox.ascx.cs @@ -33,18 +33,18 @@ using WebsitePanel.Providers.ResultObjects; namespace WebsitePanel.Portal.ExchangeServer { - public partial class ExchangeCreateMailbox : WebsitePanelModuleBase - { - private bool IsNewUser - { - get - { - return NewUserTable.Visible; - } - } - + public partial class ExchangeCreateMailbox : WebsitePanelModuleBase + { + private bool IsNewUser + { + get + { + return NewUserTable.Visible; + } + } + protected void Page_Load(object sender, EventArgs e) - { + { if (!IsPostBack) { password.SetPackagePolicy(PanelSecurity.PackageId, UserSettings.EXCHANGE_POLICY, "MailboxPasswordPolicy"); @@ -64,16 +64,32 @@ namespace WebsitePanel.Portal.ExchangeServer messageBox.ShowMessage(passwordPolicy, "EXCHANGE_CREATE_MAILBOX", "HostedOrganization"); return; } - + PackageInfo package = ES.Services.Packages.GetPackage(PanelSecurity.PackageId); if (package != null) { - UserInfo user = ES.Services.Users.GetUserById(package.UserId); - if (user != null) - sendInstructionEmail.Text = user.Email; + //UserInfo user = ES.Services.Users.GetUserById(package.UserId); + //if (user != null) + //sendInstructionEmail.Text = user.Email; } - } - } + + WebsitePanel.Providers.HostedSolution.ExchangeMailboxPlan[] plans = ES.Services.ExchangeServer.GetExchangeMailboxPlans(PanelRequest.ItemID); + + if (plans.Length == 0) + btnCreate.Enabled = false; + } + + + PackageContext cntx = PackagesHelper.GetCachedPackageContext(PanelSecurity.PackageId); + if (cntx.Quotas.ContainsKey(Quotas.EXCHANGE2007_ISCONSUMER)) + { + if (cntx.Quotas[Quotas.EXCHANGE2007_ISCONSUMER].QuotaAllocatedValue != 1) + { + locSubscriberNumber.Visible = txtSubscriberNumber.Visible = valRequireSubscriberNumber.Enabled = false; + } + } + + } protected void btnCreate_Click(object sender, EventArgs e) { @@ -92,23 +108,27 @@ namespace WebsitePanel.Portal.ExchangeServer string accountName = IsNewUser ? string.Empty : userSelector.GetAccount(); ExchangeAccountType type = IsNewUser - ? (ExchangeAccountType) Utils.ParseInt(rbMailboxType.SelectedValue, 1) + ? (ExchangeAccountType)Utils.ParseInt(rbMailboxType.SelectedValue, 1) : ExchangeAccountType.Mailbox; - + string domain = IsNewUser ? email.DomainName : userSelector.GetPrimaryEmailAddress().Split('@')[1]; int accountId = IsNewUser ? 0 : userSelector.GetAccountId(); + string subscriberNumber = IsNewUser ? txtSubscriberNumber.Text.Trim() : userSelector.GetSubscriberNumber(); + accountId = ES.Services.ExchangeServer.CreateMailbox(PanelRequest.ItemID, accountId, type, accountName, displayName, name, domain, password.Password, - chkSendInstructions.Checked, - sendInstructionEmail.Text); - - + false, + "", + Convert.ToInt32(mailboxPlanSelector.MailboxPlanId), + subscriberNumber); + + if (accountId < 0) { messageBox.ShowResultMessage(accountId); @@ -125,7 +145,7 @@ namespace WebsitePanel.Portal.ExchangeServer } } - + protected void rbtnUserExistingUser_CheckedChanged(object sender, EventArgs e) { @@ -138,7 +158,7 @@ namespace WebsitePanel.Portal.ExchangeServer NewUserTable.Visible = true; ExistingUserTable.Visible = false; - } - - } + } + + } } \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeCreateMailbox.ascx.designer.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeCreateMailbox.ascx.designer.cs index 7380d76e..2c5c9255 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeCreateMailbox.ascx.designer.cs +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeCreateMailbox.ascx.designer.cs @@ -1,22 +1,15 @@ //------------------------------------------------------------------------------ // // This code was generated by a tool. -// Runtime Version:2.0.50727.1378 // // Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. +// the code is regenerated. // //------------------------------------------------------------------------------ namespace WebsitePanel.Portal.ExchangeServer { - /// - /// ExchangeCreateMailbox class. - /// - /// - /// Auto-generated class. - /// public partial class ExchangeCreateMailbox { /// @@ -145,6 +138,33 @@ namespace WebsitePanel.Portal.ExchangeServer { /// protected global::System.Web.UI.WebControls.RequiredFieldValidator valRequireDisplayName; + /// + /// locSubscriberNumber control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Localize locSubscriberNumber; + + /// + /// txtSubscriberNumber control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.TextBox txtSubscriberNumber; + + /// + /// valRequireSubscriberNumber control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.RequiredFieldValidator valRequireSubscriberNumber; + /// /// locAccount control. /// @@ -227,22 +247,22 @@ namespace WebsitePanel.Portal.ExchangeServer { protected global::WebsitePanel.Portal.ExchangeServer.UserControls.UserSelector userSelector; /// - /// chkSendInstructions control. + /// locMailboxplanName control. /// /// /// Auto-generated field. /// To modify move field declaration from designer file to code-behind file. /// - protected global::System.Web.UI.WebControls.CheckBox chkSendInstructions; + protected global::System.Web.UI.WebControls.Localize locMailboxplanName; /// - /// sendInstructionEmail control. + /// mailboxPlanSelector control. /// /// /// Auto-generated field. /// To modify move field declaration from designer file to code-behind file. /// - protected global::WebsitePanel.Portal.UserControls.EmailControl sendInstructionEmail; + protected global::WebsitePanel.Portal.ExchangeServer.UserControls.MailboxPlanSelector mailboxPlanSelector; /// /// btnCreate control. diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeDistributionListEmailAddresses.ascx b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeDistributionListEmailAddresses.ascx index 2c0d04a2..879fbec5 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeDistributionListEmailAddresses.ascx +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeDistributionListEmailAddresses.ascx @@ -7,13 +7,12 @@ <%@ Register TagPrefix="wsp" TagName="CollapsiblePanel" Src="../UserControls/CollapsiblePanel.ascx" %> diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeDistributionListEmailAddresses.ascx.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeDistributionListEmailAddresses.ascx.cs index 06f4b5ff..0f986fc9 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeDistributionListEmailAddresses.ascx.cs +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeDistributionListEmailAddresses.ascx.cs @@ -1,4 +1,4 @@ -// Copyright (c) 2012, Outercurve Foundation. +// Copyright (c) 2011, Outercurve Foundation. // All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, @@ -42,16 +42,17 @@ using WebsitePanel.EnterpriseServer; namespace WebsitePanel.Portal.ExchangeServer { - public partial class ExchangeDistributionListEmailAddresses : WebsitePanelModuleBase - { - protected void Page_Load(object sender, EventArgs e) - { + public partial class ExchangeDistributionListEmailAddresses : WebsitePanelModuleBase + { + protected void Page_Load(object sender, EventArgs e) + { if (!IsPostBack) { BindEmails(); } + - } + } private void BindEmails() { @@ -79,11 +80,11 @@ namespace WebsitePanel.Portal.ExchangeServer { if (!Page.IsValid) return; - - btnDeleteAddresses.Enabled = true; - btnSetAsPrimary.Enabled = true; - try + btnDeleteAddresses.Enabled = true; + btnSetAsPrimary.Enabled = true; + + try { int result = ES.Services.ExchangeServer.AddDistributionListEmailAddress( PanelRequest.ItemID, PanelRequest.AccountID, email.Email); @@ -94,17 +95,17 @@ namespace WebsitePanel.Portal.ExchangeServer return; } - // rebind - BindEmails(); + // rebind + BindEmails(); } catch (Exception ex) { - messageBox.ShowErrorMessage("EXCHANGE_DLIST_ADD_EMAIL", ex); + messageBox.ShowErrorMessage("EXCHANGE_DLIST_ADD_EMAIL", ex); } - // clear field - email.AccountName = ""; + // clear field + email.AccountName = ""; } protected void btnSetAsPrimary_Click(object sender, EventArgs e) @@ -113,10 +114,10 @@ namespace WebsitePanel.Portal.ExchangeServer { string email = null; bool Checked = false; - + for (int i = 0; i < gvEmails.Rows.Count; i++) { - + GridViewRow row = gvEmails.Rows[i]; CheckBox chkSelect = (CheckBox)row.FindControl("chkSelect"); if (chkSelect.Checked) @@ -145,14 +146,14 @@ namespace WebsitePanel.Portal.ExchangeServer return; } - // rebind - BindEmails(); + // rebind + BindEmails(); messageBox.ShowSuccessMessage("EXCHANGE_MAILBOX_SET_DEFAULT_EMAIL"); } catch (Exception ex) { - messageBox.ShowErrorMessage("EXCHANGE_DLIST_SET_DEFAULT_EMAIL", ex); + messageBox.ShowErrorMessage("EXCHANGE_DLIST_SET_DEFAULT_EMAIL", ex); } } @@ -187,13 +188,13 @@ namespace WebsitePanel.Portal.ExchangeServer return; } - // rebind - BindEmails(); + // rebind + BindEmails(); } catch (Exception ex) { - messageBox.ShowErrorMessage("EXCHANGE_DLIST_DELETE_EMAILS", ex); + messageBox.ShowErrorMessage("EXCHANGE_DLIST_DELETE_EMAILS", ex); } } - } + } } \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeDistributionListEmailAddresses.ascx.designer.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeDistributionListEmailAddresses.ascx.designer.cs index a961bc7a..7ccebf49 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeDistributionListEmailAddresses.ascx.designer.cs +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeDistributionListEmailAddresses.ascx.designer.cs @@ -1,34 +1,186 @@ //------------------------------------------------------------------------------ // // This code was generated by a tool. -// Runtime Version:2.0.50727.42 // // Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. +// the code is regenerated. // //------------------------------------------------------------------------------ namespace WebsitePanel.Portal.ExchangeServer { + public partial class ExchangeDistributionListEmailAddresses { - protected WebsitePanel.Portal.ExchangeServer.UserControls.Breadcrumb breadcrumb; - protected WebsitePanel.Portal.ExchangeServer.UserControls.Menu menu; - protected System.Web.UI.WebControls.Image Image1; - protected System.Web.UI.WebControls.Localize locTitle; - protected System.Web.UI.WebControls.Literal litDisplayName; - protected WebsitePanel.Portal.ExchangeServer.UserControls.DistributionListTabs tabs; - protected WebsitePanel.Portal.UserControls.SimpleMessageBox messageBox; - protected System.Web.UI.WebControls.Label lblAddEmail; - protected System.Web.UI.WebControls.Localize locAccount; - protected WebsitePanel.Portal.ExchangeServer.UserControls.EmailAddress email; - protected System.Web.UI.WebControls.Button btnAddEmail; - protected WebsitePanel.Portal.CollapsiblePanel secExistingAddresses; - protected System.Web.UI.WebControls.Panel ExistingAddresses; - protected System.Web.UI.WebControls.GridView gvEmails; - protected System.Web.UI.WebControls.Localize locTotal; - protected System.Web.UI.WebControls.Label lblTotal; - protected System.Web.UI.WebControls.Button btnSetAsPrimary; - protected System.Web.UI.WebControls.Button btnDeleteAddresses; - protected System.Web.UI.WebControls.Localize FormComments; + + /// + /// breadcrumb control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.ExchangeServer.UserControls.Breadcrumb breadcrumb; + + /// + /// menu control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.ExchangeServer.UserControls.Menu menu; + + /// + /// Image1 control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Image Image1; + + /// + /// locTitle control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Localize locTitle; + + /// + /// litDisplayName control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Literal litDisplayName; + + /// + /// tabs control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.ExchangeServer.UserControls.DistributionListTabs tabs; + + /// + /// messageBox control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.UserControls.SimpleMessageBox messageBox; + + /// + /// lblAddEmail control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Label lblAddEmail; + + /// + /// locAccount control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Localize locAccount; + + /// + /// email control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.ExchangeServer.UserControls.EmailAddress email; + + /// + /// btnAddEmail control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Button btnAddEmail; + + /// + /// secExistingAddresses control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.CollapsiblePanel secExistingAddresses; + + /// + /// ExistingAddresses control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Panel ExistingAddresses; + + /// + /// gvEmails control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.GridView gvEmails; + + /// + /// locTotal control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Localize locTotal; + + /// + /// lblTotal control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Label lblTotal; + + /// + /// btnSetAsPrimary control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Button btnSetAsPrimary; + + /// + /// btnDeleteAddresses control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Button btnDeleteAddresses; + + /// + /// FormComments control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Localize FormComments; } } diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeDistributionListGeneralSettings.ascx.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeDistributionListGeneralSettings.ascx.cs index 072a415c..4382712e 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeDistributionListGeneralSettings.ascx.cs +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeDistributionListGeneralSettings.ascx.cs @@ -39,18 +39,21 @@ using System.Web.UI.HtmlControls; using WebsitePanel.Providers.HostedSolution; using Microsoft.Security.Application; +using WebsitePanel.EnterpriseServer; namespace WebsitePanel.Portal.ExchangeServer { - public partial class ExchangeDistributionListGeneralSettings : WebsitePanelModuleBase - { - protected void Page_Load(object sender, EventArgs e) - { + public partial class ExchangeDistributionListGeneralSettings : WebsitePanelModuleBase + { + protected void Page_Load(object sender, EventArgs e) + { if (!IsPostBack) { BindSettings(); } - } + + + } private void BindSettings() { @@ -60,7 +63,7 @@ namespace WebsitePanel.Portal.ExchangeServer ExchangeDistributionList dlist = ES.Services.ExchangeServer.GetDistributionListGeneralSettings( PanelRequest.ItemID, PanelRequest.AccountID); - litDisplayName.Text = dlist.DisplayName; + litDisplayName.Text = dlist.DisplayName; // bind form txtDisplayName.Text = dlist.DisplayName; @@ -74,7 +77,7 @@ namespace WebsitePanel.Portal.ExchangeServer } catch (Exception ex) { - messageBox.ShowErrorMessage("EXCHANGE_GET_DLIST_SETTINGS", ex); + messageBox.ShowErrorMessage("EXCHANGE_GET_DLIST_SETTINGS", ex); } } @@ -102,13 +105,13 @@ namespace WebsitePanel.Portal.ExchangeServer return; } - litDisplayName.Text = AntiXss.HtmlEncode(txtDisplayName.Text); + litDisplayName.Text = AntiXss.HtmlEncode(txtDisplayName.Text); - messageBox.ShowSuccessMessage("EXCHANGE_UPDATE_DLIST_SETTINGS"); + messageBox.ShowSuccessMessage("EXCHANGE_UPDATE_DLIST_SETTINGS"); } catch (Exception ex) { - messageBox.ShowErrorMessage("EXCHANGE_UPDATE_DLIST_SETTINGS", ex); + messageBox.ShowErrorMessage("EXCHANGE_UPDATE_DLIST_SETTINGS", ex); } } @@ -122,5 +125,5 @@ namespace WebsitePanel.Portal.ExchangeServer args.IsValid = manager.GetAccount() != null; } - } + } } \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeDistributionListGeneralSettings.ascx.designer.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeDistributionListGeneralSettings.ascx.designer.cs index d47594e0..4c435967 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeDistributionListGeneralSettings.ascx.designer.cs +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeDistributionListGeneralSettings.ascx.designer.cs @@ -1,10 +1,9 @@ //------------------------------------------------------------------------------ // // This code was generated by a tool. -// Runtime Version:2.0.50727.3053 // // Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. +// the code is regenerated. // //------------------------------------------------------------------------------ diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeDistributionListMailFlowSettings.ascx.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeDistributionListMailFlowSettings.ascx.cs index b857eb64..a8101656 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeDistributionListMailFlowSettings.ascx.cs +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeDistributionListMailFlowSettings.ascx.cs @@ -38,17 +38,20 @@ using System.Web.UI.WebControls.WebParts; using System.Web.UI.HtmlControls; using WebsitePanel.Providers.HostedSolution; +using WebsitePanel.EnterpriseServer; namespace WebsitePanel.Portal.ExchangeServer { - public partial class ExchangeDistributionListMailFlowSettings : WebsitePanelModuleBase - { + public partial class ExchangeDistributionListMailFlowSettings : WebsitePanelModuleBase + { protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { BindSettings(); } + + } private void BindSettings() @@ -59,7 +62,7 @@ namespace WebsitePanel.Portal.ExchangeServer ExchangeDistributionList dlist = ES.Services.ExchangeServer.GetDistributionListMailFlowSettings( PanelRequest.ItemID, PanelRequest.AccountID); - litDisplayName.Text = dlist.DisplayName; + litDisplayName.Text = dlist.DisplayName; // bind form acceptAccounts.SetAccounts(dlist.AcceptAccounts); @@ -68,7 +71,7 @@ namespace WebsitePanel.Portal.ExchangeServer } catch (Exception ex) { - messageBox.ShowErrorMessage("EXCHANGE_GET_DLIST_MAILFLOW", ex); + messageBox.ShowErrorMessage("EXCHANGE_GET_DLIST_MAILFLOW", ex); } } @@ -92,11 +95,11 @@ namespace WebsitePanel.Portal.ExchangeServer return; } - messageBox.ShowSuccessMessage("EXCHANGE_UPDATE_DLIST_MAILFLOW"); + messageBox.ShowSuccessMessage("EXCHANGE_UPDATE_DLIST_MAILFLOW"); } catch (Exception ex) { - messageBox.ShowErrorMessage("EXCHANGE_UPDATE_DLIST_MAILFLOW", ex); + messageBox.ShowErrorMessage("EXCHANGE_UPDATE_DLIST_MAILFLOW", ex); } } @@ -104,5 +107,5 @@ namespace WebsitePanel.Portal.ExchangeServer { SaveSettings(); } - } + } } \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeDistributionListMailFlowSettings.ascx.designer.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeDistributionListMailFlowSettings.ascx.designer.cs index 8acd9d04..6323eb4a 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeDistributionListMailFlowSettings.ascx.designer.cs +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeDistributionListMailFlowSettings.ascx.designer.cs @@ -1,22 +1,15 @@ //------------------------------------------------------------------------------ // // This code was generated by a tool. -// Runtime Version:2.0.50727.312 // // Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. +// the code is regenerated. // //------------------------------------------------------------------------------ namespace WebsitePanel.Portal.ExchangeServer { - /// - /// ExchangeDistributionListMailFlowSettings class. - /// - /// - /// Auto-generated class. - /// public partial class ExchangeDistributionListMailFlowSettings { /// diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeDistributionListPermissions.ascx.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeDistributionListPermissions.ascx.cs index 391caa18..e6ff43a8 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeDistributionListPermissions.ascx.cs +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeDistributionListPermissions.ascx.cs @@ -29,6 +29,7 @@ using System; using WebsitePanel.Providers.Common; using WebsitePanel.Providers.ResultObjects; +using WebsitePanel.EnterpriseServer; namespace WebsitePanel.Portal.ExchangeServer { @@ -43,24 +44,26 @@ namespace WebsitePanel.Portal.ExchangeServer { litDisplayName.Text = res.Value.DisplayName; sendBehalfList.SetAccounts(res.Value.SendOnBehalfAccounts); - sendAsList.SetAccounts(res.Value.SendAsAccounts); + sendAsList.SetAccounts(res.Value.SendAsAccounts); } else { messageBox.ShowMessage(res, "SET_DISTRIBUTION_LIST_PERMISSIONS", "HostedOrganization"); } - - + + } + + } protected void btnSave_Click(object sender, EventArgs e) { - string []sendBehalfAccouts = sendBehalfList.GetAccounts(); - string []sendAsAccounts = sendAsList.GetAccounts(); + string[] sendBehalfAccouts = sendBehalfList.GetAccounts(); + string[] sendAsAccounts = sendAsList.GetAccounts(); - ResultObject res = ES.Services.ExchangeServer.SetDistributionListPermissions(PanelRequest.ItemID, PanelRequest.AccountID, sendAsAccounts, sendBehalfAccouts); + ResultObject res = ES.Services.ExchangeServer.SetDistributionListPermissions(PanelRequest.ItemID, PanelRequest.AccountID, sendAsAccounts, sendBehalfAccouts); messageBox.ShowMessage(res, "SET_DISTRIBUTION_LIST_PERMISSIONS", ""); } } diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeDistributionListPermissions.ascx.designer.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeDistributionListPermissions.ascx.designer.cs index c524bab3..cd5f70ec 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeDistributionListPermissions.ascx.designer.cs +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeDistributionListPermissions.ascx.designer.cs @@ -1,10 +1,9 @@ //------------------------------------------------------------------------------ // // This code was generated by a tool. -// Runtime Version:2.0.50727.1873 // // Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. +// the code is regenerated. // //------------------------------------------------------------------------------ diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeDistributionLists.ascx b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeDistributionLists.ascx index 57504228..f3f006d6 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeDistributionLists.ascx +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeDistributionLists.ascx @@ -32,13 +32,6 @@
    - - 10 - 20 - 50 - 100 - DisplayName Email @@ -51,7 +44,7 @@ + DataSourceID="odsAccountsPaged"> diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeDistributionLists.ascx.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeDistributionLists.ascx.cs index 31a95d2e..4c44664a 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeDistributionLists.ascx.cs +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeDistributionLists.ascx.cs @@ -38,27 +38,30 @@ using System.Web.UI.WebControls.WebParts; using System.Web.UI.HtmlControls; using WebsitePanel.Providers.HostedSolution; +using WebsitePanel.EnterpriseServer; namespace WebsitePanel.Portal.ExchangeServer { - public partial class ExchangeDistributionLists : WebsitePanelModuleBase - { - protected void Page_Load(object sender, EventArgs e) - { + public partial class ExchangeDistributionLists : WebsitePanelModuleBase + { + protected void Page_Load(object sender, EventArgs e) + { if (!IsPostBack) { - BindStats(); + BindStats(); } - } - private void BindStats() - { - // quota values - OrganizationStatistics stats = - ES.Services.ExchangeServer.GetOrganizationStatistics(PanelRequest.ItemID); - listsQuota.QuotaUsedValue = stats.CreatedDistributionLists; - listsQuota.QuotaValue = stats.AllocatedDistributionLists; - } + + } + + private void BindStats() + { + // quota values + OrganizationStatistics stats = + ES.Services.ExchangeServer.GetOrganizationStatistics(PanelRequest.ItemID); + listsQuota.QuotaUsedValue = stats.CreatedDistributionLists; + listsQuota.QuotaValue = stats.AllocatedDistributionLists; + } protected void btnCreateList_Click(object sender, EventArgs e) { @@ -66,21 +69,21 @@ namespace WebsitePanel.Portal.ExchangeServer "SpaceID=" + PanelSecurity.PackageId.ToString())); } - public string GetListEditUrl(string accountId) - { - return EditUrl("SpaceID", PanelSecurity.PackageId.ToString(), "dlist_settings", - "AccountID=" + accountId, - "ItemID=" + PanelRequest.ItemID.ToString()); - } + public string GetListEditUrl(string accountId) + { + return EditUrl("SpaceID", PanelSecurity.PackageId.ToString(), "dlist_settings", + "AccountID=" + accountId, + "ItemID=" + PanelRequest.ItemID.ToString()); + } - protected void odsAccountsPaged_Selected(object sender, ObjectDataSourceStatusEventArgs e) - { - if (e.Exception != null) - { - messageBox.ShowErrorMessage("EXCHANGE_GET_LISTS", e.Exception); - e.ExceptionHandled = true; - } - } + protected void odsAccountsPaged_Selected(object sender, ObjectDataSourceStatusEventArgs e) + { + if (e.Exception != null) + { + messageBox.ShowErrorMessage("EXCHANGE_GET_LISTS", e.Exception); + e.ExceptionHandled = true; + } + } protected void gvLists_RowCommand(object sender, GridViewCommandEventArgs e) { @@ -101,25 +104,13 @@ namespace WebsitePanel.Portal.ExchangeServer // rebind grid gvLists.DataBind(); - BindStats(); + BindStats(); } catch (Exception ex) { - messageBox.ShowErrorMessage("EXCHANGE_DELETE_DISTRIBUTION_LIST", ex); + messageBox.ShowErrorMessage("EXCHANGE_DELETE_DISTRIBUTION_LIST", ex); } } } - - protected void ddlPageSize_SelectedIndexChanged(object sender, EventArgs e) - { - gvLists.PageSize = Convert.ToInt16(ddlPageSize.SelectedValue); - - // rebind grid - gvLists.DataBind(); - - // bind stats - BindStats(); - - } - } + } } \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeDistributionLists.ascx.designer.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeDistributionLists.ascx.designer.cs index b2601fcd..a6826723 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeDistributionLists.ascx.designer.cs +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeDistributionLists.ascx.designer.cs @@ -93,15 +93,6 @@ namespace WebsitePanel.Portal.ExchangeServer { /// protected global::System.Web.UI.WebControls.Localize locSearch; - /// - /// ddlPageSize control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.DropDownList ddlPageSize; - /// /// ddlSearchColumn control. /// diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeDomainNames.ascx.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeDomainNames.ascx.cs index fa2ca3c5..6a2caaed 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeDomainNames.ascx.cs +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeDomainNames.ascx.cs @@ -33,34 +33,36 @@ using WebsitePanel.Providers.HostedSolution; namespace WebsitePanel.Portal.ExchangeServer { - public partial class ExchangeDomainNames : WebsitePanelModuleBase - { - protected void Page_Load(object sender, EventArgs e) - { - if (!IsPostBack) - { - BindStats(); + public partial class ExchangeDomainNames : WebsitePanelModuleBase + { + protected void Page_Load(object sender, EventArgs e) + { + if (!IsPostBack) + { + BindStats(); // bind domain names BindDomainNames(); - } - } + } + + + } private void BindStats() - { + { // set quotas - OrganizationStatistics stats = - ES.Services.Organizations.GetOrganizationStatistics(PanelRequest.ItemID); - domainsQuota.QuotaUsedValue = stats.CreatedDomains; - domainsQuota.QuotaValue = stats.AllocatedDomains; - } + OrganizationStatistics stats = + ES.Services.Organizations.GetOrganizationStatistics(PanelRequest.ItemID); + domainsQuota.QuotaUsedValue = stats.CreatedDomains; + domainsQuota.QuotaValue = stats.AllocatedDomains; + } - public string GetDomainRecordsEditUrl(string domainId) - { - return EditUrl("SpaceID", PanelSecurity.PackageId.ToString(), "domain_records", - "DomainID=" + domainId, - "ItemID=" + PanelRequest.ItemID); - } + public string GetDomainRecordsEditUrl(string domainId) + { + return EditUrl("SpaceID", PanelSecurity.PackageId.ToString(), "domain_records", + "DomainID=" + domainId, + "ItemID=" + PanelRequest.ItemID); + } private void BindDomainNames() { @@ -107,7 +109,7 @@ namespace WebsitePanel.Portal.ExchangeServer // rebind domains BindDomainNames(); - BindStats(); + BindStats(); } catch (Exception ex) { @@ -140,5 +142,5 @@ namespace WebsitePanel.Portal.ExchangeServer ShowErrorMessage("EXCHANGE_SET_DEFAULT_DOMAIN", ex); } } - } + } } \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeDomainNames.ascx.designer.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeDomainNames.ascx.designer.cs index 56eedb42..13135b73 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeDomainNames.ascx.designer.cs +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeDomainNames.ascx.designer.cs @@ -1,10 +1,9 @@ //------------------------------------------------------------------------------ // // This code was generated by a tool. -// Runtime Version:2.0.50727.1433 // // Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. +// the code is regenerated. // //------------------------------------------------------------------------------ diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeDomainRecords.ascx.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeDomainRecords.ascx.cs index 81796d94..61ac3ba0 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeDomainRecords.ascx.cs +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeDomainRecords.ascx.cs @@ -42,25 +42,38 @@ using WebsitePanel.EnterpriseServer; namespace WebsitePanel.Portal.ExchangeServer { - public partial class ExchangeDomainRecords : WebsitePanelModuleBase - { - protected void Page_Load(object sender, EventArgs e) - { - if (!IsPostBack) - { - // save return URL - ViewState["ReturnUrl"] = Request.UrlReferrer.ToString(); + public partial class ExchangeDomainRecords : WebsitePanelModuleBase + { + protected void Page_Load(object sender, EventArgs e) + { + if (!IsPostBack) + { + // save return URL + ViewState["ReturnUrl"] = Request.UrlReferrer.ToString(); - ToggleRecordControls(); + ToggleRecordControls(); - // domain name - DomainInfo domain = ES.Services.Servers.GetDomain(PanelRequest.DomainID); - litDomainName.Text = domain.DomainName; - } - } + // domain name + DomainInfo domain = ES.Services.Servers.GetDomain(PanelRequest.DomainID); + litDomainName.Text = domain.DomainName; + } + + + if (PanelSecurity.LoggedUser.Role == UserRole.User) + { + if (!PackagesHelper.CheckGroupQuotaEnabled(PanelSecurity.PackageId, ResourceGroups.Dns, Quotas.DNS_EDITOR)) + { + this.ExcludeDisableControls.Add(btnBack); + this.DisableControls = true; + } + } + + + + } public string GetRecordFullData(string recordType, string recordData, int mxPriority, int port) - { + { switch (recordType) { case "MX": @@ -72,8 +85,8 @@ namespace WebsitePanel.Portal.ExchangeServer } } - private void GetRecordsDetails(int recordIndex) - { + private void GetRecordsDetails(int recordIndex) + { GridViewRow row = gvRecords.Rows[recordIndex]; ViewState["SrvPort"] = ((Literal)row.Cells[0].FindControl("litSrvPort")).Text; ViewState["SrvWeight"] = ((Literal)row.Cells[0].FindControl("litSrvWeight")).Text; @@ -84,8 +97,8 @@ namespace WebsitePanel.Portal.ExchangeServer ViewState["RecordData"] = ((Literal)row.Cells[0].FindControl("litRecordData")).Text; } - private void BindDnsRecord(int recordIndex) - { + private void BindDnsRecord(int recordIndex) + { try { ViewState["NewRecord"] = false; @@ -107,13 +120,13 @@ namespace WebsitePanel.Portal.ExchangeServer } } - protected void ddlRecordType_SelectedIndexChanged(object sender, EventArgs e) - { - ToggleRecordControls(); - } + protected void ddlRecordType_SelectedIndexChanged(object sender, EventArgs e) + { + ToggleRecordControls(); + } - private void ToggleRecordControls() - { + private void ToggleRecordControls() + { rowMXPriority.Visible = false; rowSRVPriority.Visible = false; rowSRVWeight.Visible = false; @@ -141,18 +154,18 @@ namespace WebsitePanel.Portal.ExchangeServer } } - private void SaveRecord() - { - if (!Page.IsValid) - return; + private void SaveRecord() + { + if (!Page.IsValid) + return; - bool existingRecord = ViewState["ExistingRecord"] != null; + bool existingRecord = ViewState["ExistingRecord"] != null; - if (!existingRecord) - { - // add record - try - { + if (!existingRecord) + { + // add record + try + { int result = ES.Services.Servers.AddDnsZoneRecord(PanelRequest.DomainID, txtRecordName.Text.Trim(), (DnsRecordType) @@ -164,23 +177,23 @@ namespace WebsitePanel.Portal.ExchangeServer Int32.Parse(txtSRVWeight.Text.Trim()), Int32.Parse(txtSRVPort.Text.Trim())); - if (result < 0) - { - messageBox.ShowResultMessage(result); - return; - } - } - catch (Exception ex) - { - messageBox.ShowErrorMessage("GDNS_ADD_RECORD", ex); - return; - } - } - else - { - // update record - try - { + if (result < 0) + { + messageBox.ShowResultMessage(result); + return; + } + } + catch (Exception ex) + { + messageBox.ShowErrorMessage("GDNS_ADD_RECORD", ex); + return; + } + } + else + { + // update record + try + { int result = ES.Services.Servers.UpdateDnsZoneRecord(PanelRequest.DomainID, ViewState["RecordName"].ToString(), ViewState["RecordData"].ToString(), @@ -192,64 +205,64 @@ namespace WebsitePanel.Portal.ExchangeServer Int32.Parse(txtSRVWeight.Text.Trim()), Int32.Parse(txtSRVPort.Text.Trim())); - if (result < 0) - { - messageBox.ShowResultMessage(result); - return; - } - } - catch (Exception ex) - { - messageBox.ShowErrorMessage("GDNS_UPDATE_RECORD", ex); - return; - } - } + if (result < 0) + { + messageBox.ShowResultMessage(result); + return; + } + } + catch (Exception ex) + { + messageBox.ShowErrorMessage("GDNS_UPDATE_RECORD", ex); + return; + } + } - ResetPopup(); + ResetPopup(); - // rebind and switch - gvRecords.DataBind(); - } + // rebind and switch + gvRecords.DataBind(); + } - private void DeleteRecord(int recordIndex) - { - try - { - GetRecordsDetails(recordIndex); + private void DeleteRecord(int recordIndex) + { + try + { + GetRecordsDetails(recordIndex); - int result = ES.Services.Servers.DeleteDnsZoneRecord(PanelRequest.DomainID, - ViewState["RecordName"].ToString(), - (DnsRecordType)ViewState["RecordType"], - ViewState["RecordData"].ToString()); + int result = ES.Services.Servers.DeleteDnsZoneRecord(PanelRequest.DomainID, + ViewState["RecordName"].ToString(), + (DnsRecordType)ViewState["RecordType"], + ViewState["RecordData"].ToString()); - if (result < 0) - { - messageBox.ShowResultMessage(result); - return; - } - } - catch (Exception ex) - { - messageBox.ShowErrorMessage("GDNS_DELETE_RECORD", ex); - return; - } + if (result < 0) + { + messageBox.ShowResultMessage(result); + return; + } + } + catch (Exception ex) + { + messageBox.ShowErrorMessage("GDNS_DELETE_RECORD", ex); + return; + } - // rebind grid - gvRecords.DataBind(); - } + // rebind grid + gvRecords.DataBind(); + } - protected void btnSave_Click(object sender, EventArgs e) - { - SaveRecord(); - } + protected void btnSave_Click(object sender, EventArgs e) + { + SaveRecord(); + } - protected void btnCancel_Click(object sender, EventArgs e) - { - ResetPopup(); - } + protected void btnCancel_Click(object sender, EventArgs e) + { + ResetPopup(); + } - private void ResetPopup() - { + private void ResetPopup() + { EditRecordModal.Hide(); ViewState["ExistingRecord"] = null; @@ -266,36 +279,36 @@ namespace WebsitePanel.Portal.ExchangeServer ToggleRecordControls(); } - protected void gvRecords_RowEditing(object sender, GridViewEditEventArgs e) - { - ViewState["ExistingRecord"] = true; - BindDnsRecord(e.NewEditIndex); - EditRecordModal.Show(); - e.Cancel = true; - } + protected void gvRecords_RowEditing(object sender, GridViewEditEventArgs e) + { + ViewState["ExistingRecord"] = true; + BindDnsRecord(e.NewEditIndex); + EditRecordModal.Show(); + e.Cancel = true; + } - protected void gvRecords_RowDeleting(object sender, GridViewDeleteEventArgs e) - { - DeleteRecord(e.RowIndex); - e.Cancel = true; - } + protected void gvRecords_RowDeleting(object sender, GridViewDeleteEventArgs e) + { + DeleteRecord(e.RowIndex); + e.Cancel = true; + } - protected void odsDnsRecords_Selected(object sender, ObjectDataSourceStatusEventArgs e) - { - if (e.Exception != null) - { - messageBox.ShowErrorMessage("GDNS_GET_RECORD", e.Exception); - //this.DisableControls = true; - e.ExceptionHandled = true; - } - } + protected void odsDnsRecords_Selected(object sender, ObjectDataSourceStatusEventArgs e) + { + if (e.Exception != null) + { + messageBox.ShowErrorMessage("GDNS_GET_RECORD", e.Exception); + //this.DisableControls = true; + e.ExceptionHandled = true; + } + } - protected void btnBack_Click(object sender, EventArgs e) - { - if (ViewState["ReturnUrl"] != null) - Response.Redirect(ViewState["ReturnUrl"].ToString()); - else - RedirectToBrowsePage(); - } - } + protected void btnBack_Click(object sender, EventArgs e) + { + if (ViewState["ReturnUrl"] != null) + Response.Redirect(ViewState["ReturnUrl"].ToString()); + else + RedirectToBrowsePage(); + } + } } \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeDomainRecords.ascx.designer.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeDomainRecords.ascx.designer.cs index f7333780..fe5fa391 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeDomainRecords.ascx.designer.cs +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeDomainRecords.ascx.designer.cs @@ -1,31 +1,3 @@ -// Copyright (c) 2012, Outercurve Foundation. -// All rights reserved. -// -// Redistribution and use in source and binary forms, with or without modification, -// are permitted provided that the following conditions are met: -// -// - Redistributions of source code must retain the above copyright notice, this -// list of conditions and the following disclaimer. -// -// - Redistributions in binary form must reproduce the above copyright notice, -// this list of conditions and the following disclaimer in the documentation -// and/or other materials provided with the distribution. -// -// - Neither the name of the Outercurve Foundation nor the names of its -// contributors may be used to endorse or promote products derived from this -// software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR -// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON -// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - //------------------------------------------------------------------------------ // // This code was generated by a tool. diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeMailboxAdvancedSettings.ascx.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeMailboxAdvancedSettings.ascx.cs deleted file mode 100644 index cd1eeace..00000000 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeMailboxAdvancedSettings.ascx.cs +++ /dev/null @@ -1,164 +0,0 @@ -// Copyright (c) 2012, Outercurve Foundation. -// All rights reserved. -// -// Redistribution and use in source and binary forms, with or without modification, -// are permitted provided that the following conditions are met: -// -// - Redistributions of source code must retain the above copyright notice, this -// list of conditions and the following disclaimer. -// -// - Redistributions in binary form must reproduce the above copyright notice, -// this list of conditions and the following disclaimer in the documentation -// and/or other materials provided with the distribution. -// -// - Neither the name of the Outercurve Foundation nor the names of its -// contributors may be used to endorse or promote products derived from this -// software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR -// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON -// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -using System; -using WebsitePanel.Providers.HostedSolution; -using WebsitePanel.EnterpriseServer; - -namespace WebsitePanel.Portal.ExchangeServer -{ - public partial class ExchangeMailboxAdvancedSettings : WebsitePanelModuleBase - { - protected void Page_Load(object sender, EventArgs e) - { - if (!IsPostBack) - { - BindSettings(); - } - } - - private void BindSettings() - { - try - { - // get settings - ExchangeMailbox mailbox = ES.Services.ExchangeServer.GetMailboxAdvancedSettings( - PanelRequest.ItemID, PanelRequest.AccountID); - - // title - litDisplayName.Text = mailbox.DisplayName; - - // load space context - PackageContext cntx = PackagesHelper.GetCachedPackageContext(PanelSecurity.PackageId); - - chkPOP3.Visible = cntx.Quotas.ContainsKey(Quotas.EXCHANGE2007_POP3ALLOWED) && !cntx.Quotas[Quotas.EXCHANGE2007_POP3ALLOWED].QuotaExhausted; - chkIMAP.Visible = cntx.Quotas.ContainsKey(Quotas.EXCHANGE2007_IMAPALLOWED) && !cntx.Quotas[Quotas.EXCHANGE2007_IMAPALLOWED].QuotaExhausted; - chkOWA.Visible = cntx.Quotas.ContainsKey(Quotas.EXCHANGE2007_OWAALLOWED) && !cntx.Quotas[Quotas.EXCHANGE2007_OWAALLOWED].QuotaExhausted; - chkMAPI.Visible = cntx.Quotas.ContainsKey(Quotas.EXCHANGE2007_MAPIALLOWED) && !cntx.Quotas[Quotas.EXCHANGE2007_MAPIALLOWED].QuotaExhausted; - chkActiveSync.Visible = cntx.Quotas.ContainsKey(Quotas.EXCHANGE2007_ACTIVESYNCALLOWED) && !cntx.Quotas[Quotas.EXCHANGE2007_ACTIVESYNCALLOWED].QuotaExhausted; - - // bind form - chkPOP3.Checked = mailbox.EnablePOP; - chkIMAP.Checked = mailbox.EnableIMAP; - chkOWA.Checked = mailbox.EnableOWA; - chkMAPI.Checked = mailbox.EnableMAPI; - chkActiveSync.Checked = mailbox.EnableActiveSync; - - lblTotalItems.Text = mailbox.TotalItems.ToString(); - lblTotalSize.Text = mailbox.TotalSizeMB.ToString(); - lblLastLogon.Text = Utils.FormatDateTime(mailbox.LastLogon); - lblLastLogoff.Text = Utils.FormatDateTime(mailbox.LastLogoff); - - sizeIssueWarning.ValueKB = mailbox.IssueWarningKB; - sizeProhibitSend.ValueKB = mailbox.ProhibitSendKB; - sizeProhibitSendReceive.ValueKB = mailbox.ProhibitSendReceiveKB; - - daysKeepDeletedItems.ValueDays = mailbox.KeepDeletedItemsDays; - - txtAccountName.Text = mailbox.Domain + "\\" + mailbox.AccountName; - - // get account meta - ExchangeAccount account = ES.Services.ExchangeServer.GetAccount(PanelRequest.ItemID, PanelRequest.AccountID); - chkPmmAllowed.Checked = (account.MailboxManagerActions & MailboxManagerActions.AdvancedSettings) > 0; - } - catch (Exception ex) - { - messageBox.ShowErrorMessage("EXCHANGE_GET_MAILBOX_ADVANCED", ex); - } - } - - private void SaveSettings() - { - if (!Page.IsValid) - return; - - try - { - if (((sizeIssueWarning.ValueKB <= sizeProhibitSend.ValueKB && sizeIssueWarning.ValueKB != -1) || sizeProhibitSend.ValueKB == -1) - && ((sizeProhibitSend.ValueKB <= sizeProhibitSendReceive.ValueKB && sizeProhibitSend.ValueKB != -1) || sizeProhibitSendReceive.ValueKB == -1)) - { - int result = ES.Services.ExchangeServer.SetMailboxAdvancedSettings( - PanelRequest.ItemID, PanelRequest.AccountID, - chkPOP3.Checked, - chkIMAP.Checked, - chkOWA.Checked, - chkMAPI.Checked, - chkActiveSync.Checked, - - sizeIssueWarning.ValueKB, - sizeProhibitSend.ValueKB, - sizeProhibitSendReceive.ValueKB, - - daysKeepDeletedItems.ValueDays); - - if (result < 0) - { - messageBox.ShowResultMessage(result); - return; - } - - messageBox.ShowSuccessMessage("EXCHANGE_UPDATE_MAILBOX_ADVANCED"); - } - else - { - messageBox.ShowErrorMessage("EXCHANGE_SET_ORG_LIMITS_VALIDATION"); - } - } - catch (Exception ex) - { - messageBox.ShowErrorMessage("EXCHANGE_UPDATE_MAILBOX_ADVANCED", ex); - } - } - - protected void btnSave_Click(object sender, EventArgs e) - { - SaveSettings(); - } - - protected void chkPmmAllowed_CheckedChanged(object sender, EventArgs e) - { - try - { - int result = ES.Services.ExchangeServer.SetMailboxManagerSettings(PanelRequest.ItemID, PanelRequest.AccountID, - chkPmmAllowed.Checked, MailboxManagerActions.AdvancedSettings); - - if (result < 0) - { - messageBox.ShowResultMessage(result); - return; - } - - messageBox.ShowSuccessMessage("EXCHANGE_UPDATE_MAILMANAGER"); - } - catch (Exception ex) - { - messageBox.ShowErrorMessage("EXCHANGE_UPDATE_MAILMANAGER", ex); - } - } - } -} \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeMailboxEmailAddresses.ascx b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeMailboxEmailAddresses.ascx index 44fb11c1..1e94d27f 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeMailboxEmailAddresses.ascx +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeMailboxEmailAddresses.ascx @@ -7,13 +7,12 @@ <%@ Register TagPrefix="wsp" TagName="CollapsiblePanel" Src="../UserControls/CollapsiblePanel.ascx" %> @@ -88,7 +87,7 @@
      - +
    diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeMailboxEmailAddresses.ascx.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeMailboxEmailAddresses.ascx.cs index b0e5ca58..eb6eb688 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeMailboxEmailAddresses.ascx.cs +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeMailboxEmailAddresses.ascx.cs @@ -40,34 +40,37 @@ using System.Web.UI.HtmlControls; using EntServer = WebsitePanel.EnterpriseServer; using WebsitePanel.Providers.HostedSolution; +using WebsitePanel.EnterpriseServer; namespace WebsitePanel.Portal.ExchangeServer { - public partial class ExchangeMailboxEmailAddresses : WebsitePanelModuleBase - { - protected void Page_Load(object sender, EventArgs e) - { - if (!IsPostBack) - { - BindEmails(); - } - } + public partial class ExchangeMailboxEmailAddresses : WebsitePanelModuleBase + { + protected void Page_Load(object sender, EventArgs e) + { + if (!IsPostBack) + { + BindEmails(); + } + + + } private void BindEmails() { EntServer.ExchangeEmailAddress[] emails = ES.Services.ExchangeServer.GetMailboxEmailAddresses( - PanelRequest.ItemID, PanelRequest.AccountID); + PanelRequest.ItemID, PanelRequest.AccountID); - gvEmails.DataSource = emails; + gvEmails.DataSource = emails; gvEmails.DataBind(); - lblTotal.Text = emails.Length.ToString(); + lblTotal.Text = emails.Length.ToString(); - // form title + // form title ExchangeAccount account = ES.Services.ExchangeServer.GetAccount(PanelRequest.ItemID, PanelRequest.AccountID); chkPmmAllowed.Checked = (account.MailboxManagerActions & MailboxManagerActions.EmailAddresses) > 0; - litDisplayName.Text = account.DisplayName; + litDisplayName.Text = account.DisplayName; //disable buttons if only one e-mail available, it is primary and cannot be deleted if (gvEmails.Rows.Count == 1) @@ -88,7 +91,7 @@ namespace WebsitePanel.Portal.ExchangeServer try { int result = ES.Services.ExchangeServer.AddMailboxEmailAddress( - PanelRequest.ItemID, PanelRequest.AccountID, email.Email); + PanelRequest.ItemID, PanelRequest.AccountID, email.Email); if (result < 0) { @@ -96,16 +99,16 @@ namespace WebsitePanel.Portal.ExchangeServer return; } - // rebind - BindEmails(); + // rebind + BindEmails(); } catch (Exception ex) { - messageBox.ShowErrorMessage("EXCHANGE_MAILBOX_ADD_EMAIL", ex); + messageBox.ShowErrorMessage("EXCHANGE_MAILBOX_ADD_EMAIL", ex); } - // clear field - email.AccountName = ""; + // clear field + email.AccountName = ""; } protected void btnSetAsPrimary_Click(object sender, EventArgs e) @@ -145,14 +148,14 @@ namespace WebsitePanel.Portal.ExchangeServer return; } - // rebind - BindEmails(); + // rebind + BindEmails(); - messageBox.ShowSuccessMessage("EXCHANGE_MAILBOX_SET_DEFAULT_EMAIL"); + messageBox.ShowSuccessMessage("EXCHANGE_MAILBOX_SET_DEFAULT_EMAIL"); } catch (Exception ex) { - messageBox.ShowErrorMessage("EXCHANGE_MAILBOX_SET_DEFAULT_EMAIL", ex); + messageBox.ShowErrorMessage("EXCHANGE_MAILBOX_SET_DEFAULT_EMAIL", ex); } } @@ -185,12 +188,12 @@ namespace WebsitePanel.Portal.ExchangeServer return; } - // rebind - BindEmails(); + // rebind + BindEmails(); } catch (Exception ex) { - messageBox.ShowErrorMessage("EXCHANGE_MAILBOX_DELETE_EMAILS", ex); + messageBox.ShowErrorMessage("EXCHANGE_MAILBOX_DELETE_EMAILS", ex); } } @@ -214,5 +217,5 @@ namespace WebsitePanel.Portal.ExchangeServer messageBox.ShowErrorMessage("EXCHANGE_UPDATE_MAILMANAGER", ex); } } - } + } } \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeMailboxEmailAddresses.ascx.designer.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeMailboxEmailAddresses.ascx.designer.cs index eba6138e..4a04d015 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeMailboxEmailAddresses.ascx.designer.cs +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeMailboxEmailAddresses.ascx.designer.cs @@ -1,10 +1,9 @@ //------------------------------------------------------------------------------ // // This code was generated by a tool. -// Runtime Version:2.0.50727.1433 // // Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. +// the code is regenerated. // //------------------------------------------------------------------------------ diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeMailboxGeneralSettings.ascx b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeMailboxGeneralSettings.ascx index c5c4246e..4e9a8fd4 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeMailboxGeneralSettings.ascx +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeMailboxGeneralSettings.ascx @@ -3,11 +3,12 @@ <%@ Register Src="../UserControls/SimpleMessageBox.ascx" TagName="SimpleMessageBox" TagPrefix="wsp" %> <%@ Register Src="UserControls/MailboxSelector.ascx" TagName="MailboxSelector" TagPrefix="wsp" %> <%@ Register Src="UserControls/MailboxTabs.ascx" TagName="MailboxTabs" TagPrefix="wsp" %> -<%@ Register Src="../UserControls/PasswordControl.ascx" TagName="PasswordControl" TagPrefix="wsp" %> <%@ Register Src="UserControls/Menu.ascx" TagName="Menu" TagPrefix="wsp" %> <%@ Register Src="UserControls/Breadcrumb.ascx" TagName="Breadcrumb" TagPrefix="wsp" %> <%@ Register TagPrefix="wsp" TagName="CollapsiblePanel" Src="../UserControls/CollapsiblePanel.ascx" %> <%@ Register Src="../UserControls/EnableAsyncTasksSupport.ascx" TagName="EnableAsyncTasksSupport" TagPrefix="wsp" %> +<%@ Register Src="UserControls/MailboxPlanSelector.ascx" TagName="MailboxPlanSelector" TagPrefix="wsp" %> +<%@ Register Src="../UserControls/QuotaViewer.ascx" TagName="QuotaViewer" TagPrefix="wsp" %> @@ -31,186 +32,58 @@ - - - - - - - - - - - - - - - - - - - - - - - - - -
    - - -
    - - -
    - -
    - -
    -
    -
    - -   - - -
    - -
    - - + - - - - - - - - - - - - - - - - - - - - - - -
    - -
    - -
    - -
    - -
    - -
    + + + + + + + + + + + + + + + + + + + + + +
    + +
    + +
    +
    +
    + +
    + MB +
    +
    +
    - - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - -
    - -
    - -
    - -
    - -
    - -
    - -
    + + + + + +
    +
    +
    - - - - - - - - - - - - - - - - - - - - - - - - -
    - -
    - -
    - -
    - -
    - - -
    -
    - - - - - - -
    - -
    - + - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + @@ -149,12 +162,24 @@ + + + - + + + + + diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/OrganizationHome.ascx.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/OrganizationHome.ascx.cs index a880fc62..544d78cf 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/OrganizationHome.ascx.cs +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/OrganizationHome.ascx.cs @@ -32,15 +32,16 @@ using WebsitePanel.Providers.HostedSolution; namespace WebsitePanel.Portal.ExchangeServer { - public partial class OrganizationHome : WebsitePanelModuleBase - { - protected void Page_Load(object sender, EventArgs e) - { - if (!IsPostBack) - { - BindOrgStats(); - } - } + public partial class OrganizationHome : WebsitePanelModuleBase + { + protected void Page_Load(object sender, EventArgs e) + { + if (!IsPostBack) + { + BindOrgStats(); + } + + } private void BindExchangeStats() { @@ -54,14 +55,9 @@ namespace WebsitePanel.Portal.ExchangeServer lnkLists.NavigateUrl = EditUrl("ItemID", PanelRequest.ItemID.ToString(), "dlists", "SpaceID=" + PanelSecurity.PackageId.ToString()); - lnkFolders.NavigateUrl = EditUrl("ItemID", PanelRequest.ItemID.ToString(), "public_folders", + lnkExchangeStorage.NavigateUrl = EditUrl("ItemID", PanelRequest.ItemID.ToString(), "storage_usage", "SpaceID=" + PanelSecurity.PackageId.ToString()); - - - - - mailboxesStats.QuotaUsedValue = exchangeOrgStats.CreatedMailboxes; mailboxesStats.QuotaValue = exchangeOrgStats.AllocatedMailboxes; @@ -71,79 +67,93 @@ namespace WebsitePanel.Portal.ExchangeServer listsStats.QuotaUsedValue = exchangeOrgStats.CreatedDistributionLists; listsStats.QuotaValue = exchangeOrgStats.AllocatedDistributionLists; + exchangeStorageStats.QuotaUsedValue = exchangeOrgStats.UsedDiskSpace; + exchangeStorageStats.QuotaValue = exchangeOrgStats.AllocatedDiskSpace; - foldersStats.QuotaUsedValue = exchangeOrgStats.CreatedPublicFolders; - foldersStats.QuotaValue = exchangeOrgStats.AllocatedPublicFolders; - - lnkUsedExchangeDiskSpace.Text = exchangeOrgStats.UsedDiskSpace.ToString(); - lnkUsedExchangeDiskSpace.NavigateUrl - = EditUrl("ItemID", PanelRequest.ItemID.ToString(), "storage_usage", - "SpaceID=" + PanelSecurity.PackageId.ToString()); - - - } - + private void BindOrgStats() - { - Organization org = ES.Services.Organizations.GetOrganization(PanelRequest.ItemID); + { + Organization org = ES.Services.Organizations.GetOrganization(PanelRequest.ItemID); lblOrganizationNameValue.Text = org.Name; lblOrganizationIDValue.Text = org.OrganizationId; lblCreatedValue.Text = org.CreatedDate.Date.ToShortDateString(); - + OrganizationStatistics orgStats = ES.Services.Organizations.GetOrganizationStatistics(PanelRequest.ItemID); - if (orgStats == null) - return; - - - litTotalDiskSpaceValue.Text = orgStats.UsedDiskSpace.ToString(); + if (orgStats == null) + return; domainStats.QuotaUsedValue = orgStats.CreatedDomains; domainStats.QuotaValue = orgStats.AllocatedDomains; userStats.QuotaUsedValue = orgStats.CreatedUsers; userStats.QuotaValue = orgStats.AllocatedUsers; - - - + + + lnkDomains.NavigateUrl = EditUrl("ItemID", PanelRequest.ItemID.ToString(), "domains", "SpaceID=" + PanelSecurity.PackageId); lnkUsers.NavigateUrl = EditUrl("ItemID", PanelRequest.ItemID.ToString(), "users", "SpaceID=" + PanelSecurity.PackageId); - - - //If Organization is ExchangeOrganization show exchage specific statistics - if (!string.IsNullOrEmpty(org.GlobalAddressList)) + + + + PackageContext cntx = PackagesHelper.GetCachedPackageContext(PanelSecurity.PackageId); + if (cntx.Groups.ContainsKey(ResourceGroups.Exchange)) { exchangeStatsPanel.Visible = true; BindExchangeStats(); - } else exchangeStatsPanel.Visible = false; - - PackageContext cntx = PackagesHelper.GetCachedPackageContext(PanelSecurity.PackageId); + //Show SharePoint statistics if (cntx.Groups.ContainsKey(ResourceGroups.HostedSharePoint)) { sharePointStatsPanel.Visible = true; - + lnkSiteCollections.NavigateUrl = EditUrl("ItemID", PanelRequest.ItemID.ToString(), "sharepoint_sitecollections", "SpaceID=" + PanelSecurity.PackageId); siteCollectionsStats.QuotaUsedValue = orgStats.CreatedSharePointSiteCollections; siteCollectionsStats.QuotaValue = orgStats.AllocatedSharePointSiteCollections; - + } else sharePointStatsPanel.Visible = false; + if (cntx.Groups.ContainsKey(ResourceGroups.OCS)) + { + ocsStatsPanel.Visible = true; + BindOCSStats(); + } + else + ocsStatsPanel.Visible = false; + + if (cntx.Groups.ContainsKey(ResourceGroups.BlackBerry)) + { + besStatsPanel.Visible = true; + BindBESStats(); + } + else + besStatsPanel.Visible = false; +/* + if (cntx.Groups.ContainsKey(ResourceGroups.Lync)) + { + lyncStatsPanel.Visible = true; + BindLyncStats(); + } + else + */ + lyncStatsPanel.Visible = false; + + if (org.CrmOrganizationId != Guid.Empty) { @@ -153,18 +163,51 @@ namespace WebsitePanel.Portal.ExchangeServer else crmStatsPanel.Visible = false; - - } - private void BindCRMStats(OrganizationStatistics orgStats) - { + } + + private void BindCRMStats(OrganizationStatistics orgStats) + { lnkCRMUsers.NavigateUrl = EditUrl("ItemID", PanelRequest.ItemID.ToString(), "crmusers", "SpaceID=" + PanelSecurity.PackageId); - crmUsersStats.QuotaUsedValue = orgStats.CreatedCRMUsers; - crmUsersStats.QuotaValue = orgStats.AllocatedCRMUsers; - } - - - } + crmUsersStats.QuotaUsedValue = orgStats.CreatedCRMUsers; + crmUsersStats.QuotaValue = orgStats.AllocatedCRMUsers; + } + + private void BindOCSStats() + { + OrganizationStatistics stats = ES.Services.Organizations.GetOrganizationStatistics(PanelRequest.ItemID); + ocsUsersStats.QuotaValue = stats.AllocatedOCSUsers; + ocsUsersStats.QuotaUsedValue = stats.CreatedOCSUsers; + + lnkOCSUsers.NavigateUrl = EditUrl("ItemID", PanelRequest.ItemID.ToString(), "ocs_users", + "SpaceID=" + PanelSecurity.PackageId.ToString()); + } + + private void BindLyncStats() + { + /* + OrganizationStatistics stats = ES.Services.Organizations.GetOrganizationStatistics(PanelRequest.ItemID); + lyncUsersStats.QuotaValue = stats.AllocatedLyncUsers; + lyncUsersStats.QuotaUsedValue = stats.CreatedLyncUsers; + + lnkLyncUsers.NavigateUrl = EditUrl("ItemID", PanelRequest.ItemID.ToString(), "lync_users", + "SpaceID=" + PanelSecurity.PackageId.ToString()); + */ + } + + + private void BindBESStats() + { + OrganizationStatistics stats = ES.Services.Organizations.GetOrganizationStatistics(PanelRequest.ItemID); + besUsersStats.QuotaValue = stats.AllocatedBlackBerryUsers; + besUsersStats.QuotaUsedValue = stats.CreatedBlackBerryUsers; + + lnkBESUsers.NavigateUrl = EditUrl("ItemID", PanelRequest.ItemID.ToString(), "blackberry_users", + "SpaceID=" + PanelSecurity.PackageId.ToString()); + } + + + } } \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/OrganizationHome.ascx.designer.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/OrganizationHome.ascx.designer.cs index 1dd113c8..afd604b1 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/OrganizationHome.ascx.designer.cs +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/OrganizationHome.ascx.designer.cs @@ -147,24 +147,6 @@ namespace WebsitePanel.Portal.ExchangeServer { /// protected global::WebsitePanel.Portal.QuotaViewer userStats; - /// - /// litTotalUserDiskSpace control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.Literal litTotalUserDiskSpace; - - /// - /// litTotalDiskSpaceValue control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.Literal litTotalDiskSpaceValue; - /// /// exchangeStatsPanel control. /// @@ -238,40 +220,94 @@ namespace WebsitePanel.Portal.ExchangeServer { protected global::WebsitePanel.Portal.QuotaViewer listsStats; /// - /// lnkFolders control. + /// lnkExchangeStorage control. /// /// /// Auto-generated field. /// To modify move field declaration from designer file to code-behind file. /// - protected global::System.Web.UI.WebControls.HyperLink lnkFolders; + protected global::System.Web.UI.WebControls.HyperLink lnkExchangeStorage; /// - /// foldersStats control. + /// exchangeStorageStats control. /// /// /// Auto-generated field. /// To modify move field declaration from designer file to code-behind file. /// - protected global::WebsitePanel.Portal.QuotaViewer foldersStats; + protected global::WebsitePanel.Portal.QuotaViewer exchangeStorageStats; /// - /// Literal1 control. + /// besStatsPanel control. /// /// /// Auto-generated field. /// To modify move field declaration from designer file to code-behind file. /// - protected global::System.Web.UI.WebControls.Literal Literal1; + protected global::System.Web.UI.WebControls.Panel besStatsPanel; /// - /// lnkUsedExchangeDiskSpace control. + /// locBESStatistics control. /// /// /// Auto-generated field. /// To modify move field declaration from designer file to code-behind file. /// - protected global::System.Web.UI.WebControls.HyperLink lnkUsedExchangeDiskSpace; + protected global::System.Web.UI.WebControls.Localize locBESStatistics; + + /// + /// lnkBESUsers control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.HyperLink lnkBESUsers; + + /// + /// besUsersStats control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.QuotaViewer besUsersStats; + + /// + /// lyncStatsPanel control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Panel lyncStatsPanel; + + /// + /// locLyncStatistics control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Localize locLyncStatistics; + + /// + /// lnkLyncUsers control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.HyperLink lnkLyncUsers; + + /// + /// lyncUsersStats control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.QuotaViewer lyncUsersStats; /// /// sharePointStatsPanel control. @@ -309,6 +345,42 @@ namespace WebsitePanel.Portal.ExchangeServer { /// protected global::WebsitePanel.Portal.QuotaViewer siteCollectionsStats; + /// + /// ocsStatsPanel control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Panel ocsStatsPanel; + + /// + /// locOCSStatistics control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Localize locOCSStatistics; + + /// + /// lnkOCSUsers control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.HyperLink lnkOCSUsers; + + /// + /// ocsUsersStats control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.QuotaViewer ocsUsersStats; + /// /// crmStatsPanel control. /// diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/OrganizationUserGeneralSettings.ascx b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/OrganizationUserGeneralSettings.ascx index f3f0d5a3..710b4e40 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/OrganizationUserGeneralSettings.ascx +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/OrganizationUserGeneralSettings.ascx @@ -62,6 +62,10 @@ + + + + @@ -205,8 +213,7 @@
    diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeMailboxGeneralSettings.ascx.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeMailboxGeneralSettings.ascx.cs index d4764986..e0130314 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeMailboxGeneralSettings.ascx.cs +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeMailboxGeneralSettings.ascx.cs @@ -33,67 +33,55 @@ using Microsoft.Security.Application; namespace WebsitePanel.Portal.ExchangeServer { - public partial class ExchangeMailboxGeneralSettings : WebsitePanelModuleBase - { - protected void Page_Load(object sender, EventArgs e) - { + public partial class ExchangeMailboxGeneralSettings : WebsitePanelModuleBase + { + protected void Page_Load(object sender, EventArgs e) + { if (!IsPostBack) { BindSettings(); } - } + + } private void BindSettings() { try { - password.SetPackagePolicy(PanelSecurity.PackageId, UserSettings.EXCHANGE_POLICY, "MailboxPasswordPolicy"); - password.EditMode = true; - // get settings ExchangeMailbox mailbox = ES.Services.ExchangeServer.GetMailboxGeneralSettings(PanelRequest.ItemID, PanelRequest.AccountID); - // title - litDisplayName.Text = mailbox.DisplayName; + //get statistics + ExchangeMailboxStatistics stats = ES.Services.ExchangeServer.GetMailboxStatistics(PanelRequest.ItemID, + PanelRequest.AccountID); + + // title + litDisplayName.Text = mailbox.DisplayName; // bind form - txtDisplayName.Text = mailbox.DisplayName; chkHideAddressBook.Checked = mailbox.HideFromAddressBook; chkDisable.Checked = mailbox.Disabled; - txtFirstName.Text = mailbox.FirstName; - txtInitials.Text = mailbox.Initials; - txtLastName.Text = mailbox.LastName; - - txtJobTitle.Text = mailbox.JobTitle; - txtCompany.Text = mailbox.Company; - txtDepartment.Text = mailbox.Department; - txtOffice.Text = mailbox.Office; - manager.SetAccount(mailbox.ManagerAccount); - - txtBusinessPhone.Text = mailbox.BusinessPhone; - txtFax.Text = mailbox.Fax; - txtHomePhone.Text = mailbox.HomePhone; - txtMobilePhone.Text = mailbox.MobilePhone; - txtPager.Text = mailbox.Pager; - txtWebPage.Text = mailbox.WebPage; - - txtAddress.Text = mailbox.Address; - txtCity.Text = mailbox.City; - txtState.Text = mailbox.State; - txtZip.Text = mailbox.Zip; - country.Country = mailbox.Country; - - txtNotes.Text = mailbox.Notes; - // get account meta ExchangeAccount account = ES.Services.ExchangeServer.GetAccount(PanelRequest.ItemID, PanelRequest.AccountID); chkPmmAllowed.Checked = (account.MailboxManagerActions & MailboxManagerActions.GeneralSettings) > 0; + + mailboxPlanSelector.MailboxPlanId = account.MailboxPlanId.ToString(); + + mailboxSize.QuotaUsedValue = Convert.ToInt32(stats.TotalSize / 1024 / 1024); + mailboxSize.QuotaValue = (int)Math.Round((double)(stats.MaxSize / 1024 / 1024)); + + if ((account.AccountType == ExchangeAccountType.Equipment) | (account.AccountType == ExchangeAccountType.Room)) + secCalendarSettings.Visible = true; + else + secCalendarSettings.Visible = false; + + } catch (Exception ex) { - messageBox.ShowErrorMessage("EXCHANGE_GET_MAILBOX_SETTINGS", ex); + messageBox.ShowErrorMessage("EXCHANGE_GET_MAILBOX_SETTINGS", ex); } } @@ -106,49 +94,29 @@ namespace WebsitePanel.Portal.ExchangeServer { int result = ES.Services.ExchangeServer.SetMailboxGeneralSettings( PanelRequest.ItemID, PanelRequest.AccountID, - txtDisplayName.Text, - password.Password, chkHideAddressBook.Checked, - chkDisable.Checked, - - txtFirstName.Text, - txtInitials.Text, - txtLastName.Text, - - txtAddress.Text, - txtCity.Text, - txtState.Text, - txtZip.Text, - country.Country, - - txtJobTitle.Text, - txtCompany.Text, - txtDepartment.Text, - txtOffice.Text, - manager.GetAccount(), - - txtBusinessPhone.Text, - txtFax.Text, - txtHomePhone.Text, - txtMobilePhone.Text, - txtPager.Text, - txtWebPage.Text, - txtNotes.Text); + chkDisable.Checked); if (result < 0) { messageBox.ShowResultMessage(result); return; } + else + { + result = ES.Services.ExchangeServer.SetExchangeMailboxPlan(PanelRequest.ItemID, PanelRequest.AccountID, Convert.ToInt32(mailboxPlanSelector.MailboxPlanId)); + if (result < 0) + { + messageBox.ShowResultMessage(result); + return; + } + } - // update title - litDisplayName.Text = AntiXss.HtmlEncode(txtDisplayName.Text); - - messageBox.ShowSuccessMessage("EXCHANGE_UPDATE_MAILBOX_SETTINGS"); + messageBox.ShowSuccessMessage("EXCHANGE_UPDATE_MAILBOX_SETTINGS"); } catch (Exception ex) { - messageBox.ShowErrorMessage("EXCHANGE_UPDATE_MAILBOX_SETTINGS", ex); + messageBox.ShowErrorMessage("EXCHANGE_UPDATE_MAILBOX_SETTINGS", ex); } } @@ -177,5 +145,33 @@ namespace WebsitePanel.Portal.ExchangeServer messageBox.ShowErrorMessage("EXCHANGE_UPDATE_MAILMANAGER", ex); } } - } + + private int ConvertMbxSizeToIntMB(string inputValue) + { + int result = 0; + + if ((inputValue == null) || (inputValue == "")) + return 0; + + if (inputValue.Contains("TB")) + { + result = Convert.ToInt32(inputValue.Replace(" TB", "")); + result = result * 1024 * 1024; + } + else + if (inputValue.Contains("GB")) + { + result = Convert.ToInt32(inputValue.Replace(" GB", "")); + result = result * 1024; + } + else + if (inputValue.Contains("MB")) + { + result = Convert.ToInt32(inputValue.Replace(" MB", "")); + } + + return result; + } + + } } \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeMailboxGeneralSettings.ascx.designer.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeMailboxGeneralSettings.ascx.designer.cs index 0a518f20..d1dc4f60 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeMailboxGeneralSettings.ascx.designer.cs +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeMailboxGeneralSettings.ascx.designer.cs @@ -1,10 +1,9 @@ //------------------------------------------------------------------------------ // // This code was generated by a tool. -// Runtime Version:2.0.50727.1433 // // Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. +// the code is regenerated. // //------------------------------------------------------------------------------ @@ -86,49 +85,31 @@ namespace WebsitePanel.Portal.ExchangeServer { protected global::WebsitePanel.Portal.UserControls.SimpleMessageBox messageBox; /// - /// locDisplayName control. + /// secGeneral control. /// /// /// Auto-generated field. /// To modify move field declaration from designer file to code-behind file. /// - protected global::System.Web.UI.WebControls.Localize locDisplayName; + protected global::WebsitePanel.Portal.CollapsiblePanel secGeneral; /// - /// txtDisplayName control. + /// General control. /// /// /// Auto-generated field. /// To modify move field declaration from designer file to code-behind file. /// - protected global::System.Web.UI.WebControls.TextBox txtDisplayName; + protected global::System.Web.UI.WebControls.Panel General; /// - /// valRequireDisplayName control. + /// GeneralUpdatePanel control. /// /// /// Auto-generated field. /// To modify move field declaration from designer file to code-behind file. /// - protected global::System.Web.UI.WebControls.RequiredFieldValidator valRequireDisplayName; - - /// - /// locPassword control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.Localize locPassword; - - /// - /// password control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::WebsitePanel.Portal.PasswordControl password; + protected global::System.Web.UI.UpdatePanel GeneralUpdatePanel; /// /// chkHideAddressBook control. @@ -149,418 +130,67 @@ namespace WebsitePanel.Portal.ExchangeServer { protected global::System.Web.UI.WebControls.CheckBox chkDisable; /// - /// locFirstName control. + /// Localize2 control. /// /// /// Auto-generated field. /// To modify move field declaration from designer file to code-behind file. /// - protected global::System.Web.UI.WebControls.Localize locFirstName; + protected global::System.Web.UI.WebControls.Localize Localize2; /// - /// txtFirstName control. + /// mailboxPlanSelector control. /// /// /// Auto-generated field. /// To modify move field declaration from designer file to code-behind file. /// - protected global::System.Web.UI.WebControls.TextBox txtFirstName; + protected global::WebsitePanel.Portal.ExchangeServer.UserControls.MailboxPlanSelector mailboxPlanSelector; /// - /// locInitials control. + /// locQuota control. /// /// /// Auto-generated field. /// To modify move field declaration from designer file to code-behind file. /// - protected global::System.Web.UI.WebControls.Localize locInitials; + protected global::System.Web.UI.WebControls.Localize locQuota; /// - /// txtInitials control. + /// mailboxSize control. /// /// /// Auto-generated field. /// To modify move field declaration from designer file to code-behind file. /// - protected global::System.Web.UI.WebControls.TextBox txtInitials; + protected global::WebsitePanel.Portal.QuotaViewer mailboxSize; /// - /// locLastName control. + /// secCalendarSettings control. /// /// /// Auto-generated field. /// To modify move field declaration from designer file to code-behind file. /// - protected global::System.Web.UI.WebControls.Localize locLastName; + protected global::WebsitePanel.Portal.CollapsiblePanel secCalendarSettings; /// - /// txtLastName control. + /// CalendarSettings control. /// /// /// Auto-generated field. /// To modify move field declaration from designer file to code-behind file. /// - protected global::System.Web.UI.WebControls.TextBox txtLastName; + protected global::System.Web.UI.WebControls.Panel CalendarSettings; /// - /// secCompanyInfo control. + /// UpdatePanel1 control. /// /// /// Auto-generated field. /// To modify move field declaration from designer file to code-behind file. /// - protected global::WebsitePanel.Portal.CollapsiblePanel secCompanyInfo; - - /// - /// CompanyInfo control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.Panel CompanyInfo; - - /// - /// locJobTitle control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.Localize locJobTitle; - - /// - /// txtJobTitle control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.TextBox txtJobTitle; - - /// - /// locCompany control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.Localize locCompany; - - /// - /// txtCompany control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.TextBox txtCompany; - - /// - /// locDepartment control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.Localize locDepartment; - - /// - /// txtDepartment control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.TextBox txtDepartment; - - /// - /// locOffice control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.Localize locOffice; - - /// - /// txtOffice control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.TextBox txtOffice; - - /// - /// locManager control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.Localize locManager; - - /// - /// manager control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::WebsitePanel.Portal.ExchangeServer.UserControls.MailboxSelector manager; - - /// - /// secContactInfo control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::WebsitePanel.Portal.CollapsiblePanel secContactInfo; - - /// - /// ContactInfo control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.Panel ContactInfo; - - /// - /// locBusinessPhone control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.Localize locBusinessPhone; - - /// - /// txtBusinessPhone control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.TextBox txtBusinessPhone; - - /// - /// locFax control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.Localize locFax; - - /// - /// txtFax control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.TextBox txtFax; - - /// - /// locHomePhone control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.Localize locHomePhone; - - /// - /// txtHomePhone control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.TextBox txtHomePhone; - - /// - /// locMobilePhone control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.Localize locMobilePhone; - - /// - /// txtMobilePhone control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.TextBox txtMobilePhone; - - /// - /// locPager control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.Localize locPager; - - /// - /// txtPager control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.TextBox txtPager; - - /// - /// locWebPage control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.Localize locWebPage; - - /// - /// txtWebPage control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.TextBox txtWebPage; - - /// - /// secAddressInfo control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::WebsitePanel.Portal.CollapsiblePanel secAddressInfo; - - /// - /// AddressInfo control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.Panel AddressInfo; - - /// - /// locAddress control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.Localize locAddress; - - /// - /// txtAddress control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.TextBox txtAddress; - - /// - /// locCity control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.Localize locCity; - - /// - /// txtCity control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.TextBox txtCity; - - /// - /// locState control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.Localize locState; - - /// - /// txtState control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.TextBox txtState; - - /// - /// locZip control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.Localize locZip; - - /// - /// txtZip control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.TextBox txtZip; - - /// - /// locCountry control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.Localize locCountry; - - /// - /// country control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::WebsitePanel.Portal.ExchangeServer.UserControls.CountrySelector country; - - /// - /// locNotes control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.Localize locNotes; - - /// - /// txtNotes control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.TextBox txtNotes; + protected global::System.Web.UI.UpdatePanel UpdatePanel1; /// /// chkPmmAllowed control. diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeMailboxMailFlowSettings.ascx b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeMailboxMailFlowSettings.ascx index f7bf243a..2a157a48 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeMailboxMailFlowSettings.ascx +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeMailboxMailFlowSettings.ascx @@ -106,33 +106,6 @@ - - - - - - - - - - - - - - - - - -
    - -
    - -
    - -
    -
    - diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/OrganizationCreateOrganization.ascx.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/OrganizationCreateOrganization.ascx.cs index 3d738113..73fcbb7a 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/OrganizationCreateOrganization.ascx.cs +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/OrganizationCreateOrganization.ascx.cs @@ -27,23 +27,24 @@ // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. using System; +using WebsitePanel.EnterpriseServer; namespace WebsitePanel.Portal.ExchangeServer { - public partial class OrganizationCreateOrganization : WebsitePanelModuleBase - { - protected void Page_Load(object sender, EventArgs e) - { + public partial class OrganizationCreateOrganization : WebsitePanelModuleBase + { + protected void Page_Load(object sender, EventArgs e) + { + + } - } + protected void btnCreate_Click(object sender, EventArgs e) + { + CreateOrganization(); + } - protected void btnCreate_Click(object sender, EventArgs e) - { - CreateOrganization(); - } - - private void CreateOrganization() - { + private void CreateOrganization() + { if (!Page.IsValid) return; @@ -61,12 +62,12 @@ namespace WebsitePanel.Portal.ExchangeServer Response.Redirect(EditUrl("SpaceID", PanelSecurity.PackageId.ToString(), "organization_home", "ItemID=" + itemId)); - + } catch (Exception ex) { messageBox.ShowErrorMessage("ORGANIZATION_CREATE_ORG", ex); } - } - } + } + } } \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/OrganizationCreateOrganization.ascx.designer.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/OrganizationCreateOrganization.ascx.designer.cs index fc70a311..45ffb4d3 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/OrganizationCreateOrganization.ascx.designer.cs +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/OrganizationCreateOrganization.ascx.designer.cs @@ -1,10 +1,9 @@ //------------------------------------------------------------------------------ // // This code was generated by a tool. -// Runtime Version:2.0.50727.3053 // // Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. +// the code is regenerated. // //------------------------------------------------------------------------------ diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/OrganizationCreateUser.ascx b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/OrganizationCreateUser.ascx index 55abf12f..5b6364e0 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/OrganizationCreateUser.ascx +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/OrganizationCreateUser.ascx @@ -35,6 +35,14 @@ ErrorMessage="Enter Display Name" ValidationGroup="CreateMailbox" Display="Dynamic" Text="*" SetFocusOnError="True"> + + + +
    diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeMailboxMailFlowSettings.ascx.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeMailboxMailFlowSettings.ascx.cs index d773c3fd..5c18d62e 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeMailboxMailFlowSettings.ascx.cs +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeMailboxMailFlowSettings.ascx.cs @@ -38,17 +38,19 @@ using System.Web.UI.WebControls.WebParts; using System.Web.UI.HtmlControls; using WebsitePanel.Providers.HostedSolution; +using WebsitePanel.EnterpriseServer; namespace WebsitePanel.Portal.ExchangeServer { - public partial class ExchangeMailboxMailFlowSettings : WebsitePanelModuleBase - { + public partial class ExchangeMailboxMailFlowSettings : WebsitePanelModuleBase + { protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { BindSettings(); } + } private void BindSettings() @@ -59,8 +61,8 @@ namespace WebsitePanel.Portal.ExchangeServer ExchangeMailbox mailbox = ES.Services.ExchangeServer.GetMailboxMailFlowSettings( PanelRequest.ItemID, PanelRequest.AccountID); - // title - litDisplayName.Text = mailbox.DisplayName; + // title + litDisplayName.Text = mailbox.DisplayName; // bind form chkEnabledForwarding.Checked = mailbox.EnableForwarding; @@ -73,12 +75,8 @@ namespace WebsitePanel.Portal.ExchangeServer chkSendersAuthenticated.Checked = mailbox.RequireSenderAuthentication; rejectAccounts.SetAccounts(mailbox.RejectAccounts); - sizeMaxRecipients.ValueKB = mailbox.MaxRecipients; - sizeMaxSendingSize.ValueKB = mailbox.MaxSendMessageSizeKB; - sizeMaxReceivingSize.ValueKB = mailbox.MaxReceiveMessageSizeKB; - - // toggle - ToggleControls(); + // toggle + ToggleControls(); // get account meta ExchangeAccount account = ES.Services.ExchangeServer.GetAccount(PanelRequest.ItemID, PanelRequest.AccountID); @@ -87,7 +85,7 @@ namespace WebsitePanel.Portal.ExchangeServer } catch (Exception ex) { - messageBox.ShowErrorMessage("EXCHANGE_GET_MAILBOX_MAILFLOW", ex); + messageBox.ShowErrorMessage("EXCHANGE_GET_MAILBOX_MAILFLOW", ex); } } @@ -106,12 +104,8 @@ namespace WebsitePanel.Portal.ExchangeServer chkDoNotDeleteOnForward.Checked, accessAccounts.GetAccounts(), - acceptAccounts.GetAccounts(), - rejectAccounts.GetAccounts(), - - sizeMaxRecipients.ValueKB, - sizeMaxSendingSize.ValueKB, - sizeMaxReceivingSize.ValueKB, + acceptAccounts.GetAccounts(), + rejectAccounts.GetAccounts(), chkSendersAuthenticated.Checked); @@ -121,11 +115,11 @@ namespace WebsitePanel.Portal.ExchangeServer return; } - messageBox.ShowSuccessMessage("EXCHANGE_UPDATE_MAILBOX_MAILFLOW"); + messageBox.ShowSuccessMessage("EXCHANGE_UPDATE_MAILBOX_MAILFLOW"); } catch (Exception ex) { - messageBox.ShowErrorMessage("EXCHANGE_UPDATE_MAILBOX_MAILFLOW", ex); + messageBox.ShowErrorMessage("EXCHANGE_UPDATE_MAILBOX_MAILFLOW", ex); } } @@ -134,15 +128,15 @@ namespace WebsitePanel.Portal.ExchangeServer SaveSettings(); } - private void ToggleControls() - { - ForwardSettingsPanel.Visible = chkEnabledForwarding.Checked; - } + private void ToggleControls() + { + ForwardSettingsPanel.Visible = chkEnabledForwarding.Checked; + } - protected void chkEnabledForwarding_CheckedChanged(object sender, EventArgs e) - { - ToggleControls(); - } + protected void chkEnabledForwarding_CheckedChanged(object sender, EventArgs e) + { + ToggleControls(); + } protected void chkPmmAllowed_CheckedChanged(object sender, EventArgs e) { @@ -164,5 +158,5 @@ namespace WebsitePanel.Portal.ExchangeServer messageBox.ShowErrorMessage("EXCHANGE_UPDATE_MAILMANAGER", ex); } } - } + } } \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeMailboxMailFlowSettings.ascx.designer.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeMailboxMailFlowSettings.ascx.designer.cs index 9df7fac9..85e73719 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeMailboxMailFlowSettings.ascx.designer.cs +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeMailboxMailFlowSettings.ascx.designer.cs @@ -1,10 +1,9 @@ //------------------------------------------------------------------------------ // // This code was generated by a tool. -// Runtime Version:2.0.50727.1433 // // Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. +// the code is regenerated. // //------------------------------------------------------------------------------ @@ -256,78 +255,6 @@ namespace WebsitePanel.Portal.ExchangeServer { /// protected global::WebsitePanel.Portal.ExchangeServer.UserControls.RejectedSenders rejectAccounts; - /// - /// secDeliveryOptions control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::WebsitePanel.Portal.CollapsiblePanel secDeliveryOptions; - - /// - /// DeliveryOptions control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.Panel DeliveryOptions; - - /// - /// locMaxRecipients control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.Localize locMaxRecipients; - - /// - /// sizeMaxRecipients control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::WebsitePanel.Portal.ExchangeServer.UserControls.SizeBox sizeMaxRecipients; - - /// - /// locMaxSendingSize control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.Localize locMaxSendingSize; - - /// - /// sizeMaxSendingSize control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::WebsitePanel.Portal.ExchangeServer.UserControls.SizeBox sizeMaxSendingSize; - - /// - /// locMaxReceivingSize control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.Localize locMaxReceivingSize; - - /// - /// sizeMaxReceivingSize control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::WebsitePanel.Portal.ExchangeServer.UserControls.SizeBox sizeMaxReceivingSize; - /// /// chkPmmAllowed control. /// diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeMailboxMobile.ascx.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeMailboxMobile.ascx.cs index 43b26275..53685834 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeMailboxMobile.ascx.cs +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeMailboxMobile.ascx.cs @@ -1,4 +1,4 @@ -// Copyright (c) 2012, Outercurve Foundation. +// Copyright (c) 2011, Outercurve Foundation. // All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, @@ -33,6 +33,7 @@ using System.Web.UI; using System.Web.UI.WebControls; using System.Drawing; using WebsitePanel.Providers.HostedSolution; +using WebsitePanel.EnterpriseServer; namespace WebsitePanel.Portal.ExchangeServer { @@ -51,22 +52,23 @@ namespace WebsitePanel.Portal.ExchangeServer gvMobile.DataSource = devices; gvMobile.DataBind(); - // form title - ExchangeAccount account = ES.Services.ExchangeServer.GetAccount(PanelRequest.ItemID, PanelRequest.AccountID); - litDisplayName.Text = account.DisplayName; + // form title + ExchangeAccount account = ES.Services.ExchangeServer.GetAccount(PanelRequest.ItemID, PanelRequest.AccountID); + litDisplayName.Text = account.DisplayName; } - + protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { - // ExchangeMailbox mailbox = ES.Services.ExchangeServer.GetMailboxGeneralSettings(PanelRequest.ItemID, PanelRequest.AccountID); + // ExchangeMailbox mailbox = ES.Services.ExchangeServer.GetMailboxGeneralSettings(PanelRequest.ItemID, PanelRequest.AccountID); - // if (mailbox != null) - // litDisplayName.Text = mailbox.DisplayName; + // if (mailbox != null) + // litDisplayName.Text = mailbox.DisplayName; BindGrid(); } + } protected void gvMobile_RowCommand(object sender, GridViewCommandEventArgs e) @@ -103,7 +105,7 @@ namespace WebsitePanel.Portal.ExchangeServer if (lblStatus != null) { switch (current.Status) - { + { case MobileDeviceStatus.PendingWipe: lblStatus.ForeColor = Color.Red; lblStatus.Text = GetLocalizedString(PendingWipe); diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeMailboxMobile.ascx.designer.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeMailboxMobile.ascx.designer.cs index 8df461d6..6cc0a273 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeMailboxMobile.ascx.designer.cs +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeMailboxMobile.ascx.designer.cs @@ -1,10 +1,9 @@ //------------------------------------------------------------------------------ // // This code was generated by a tool. -// Runtime Version:2.0.50727.4927 // // Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. +// the code is regenerated. // //------------------------------------------------------------------------------ diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeMailboxMobileDetails.ascx.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeMailboxMobileDetails.ascx.cs index 27a9c927..8383b5d0 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeMailboxMobileDetails.ascx.cs +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeMailboxMobileDetails.ascx.cs @@ -1,4 +1,4 @@ -// Copyright (c) 2012, Outercurve Foundation. +// Copyright (c) 2011, Outercurve Foundation. // All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, @@ -33,6 +33,7 @@ using System.Web.UI; using System.Web.UI.WebControls; using WebsitePanel.Providers.HostedSolution; using System.Drawing; +using WebsitePanel.EnterpriseServer; namespace WebsitePanel.Portal.ExchangeServer { @@ -48,26 +49,26 @@ namespace WebsitePanel.Portal.ExchangeServer if (device != null) { lblStatus.Text = GetLocalizedString(device.Status.ToString()); - switch (device.Status) - { - case MobileDeviceStatus.PendingWipe: - lblStatus.ForeColor = Color.Red; - break; - case MobileDeviceStatus.WipeSuccessful: - lblStatus.ForeColor = Color.Green; - break; - default: - lblStatus.ForeColor = Color.Black; - break; - } + switch (device.Status) + { + case MobileDeviceStatus.PendingWipe: + lblStatus.ForeColor = Color.Red; + break; + case MobileDeviceStatus.WipeSuccessful: + lblStatus.ForeColor = Color.Green; + break; + default: + lblStatus.ForeColor = Color.Black; + break; + } lblDeviceModel.Text = device.DeviceModel; lblDeviceType.Text = device.DeviceType; - lblFirstSyncTime.Text = DateTimeToString(device.FirstSyncTime); - lblDeviceWipeRequestTime.Text = DateTimeToString(device.DeviceWipeRequestTime); - lblDeviceAcnowledgeTime.Text = DateTimeToString(device.DeviceWipeAckTime); - lblLastSync.Text = DateTimeToString(device.LastSyncAttemptTime); - lblLastUpdate.Text = DateTimeToString(device.LastPolicyUpdateTime); - lblLastPing.Text = device.LastPingHeartbeat == 0 ? string.Empty : device.LastPingHeartbeat.ToString(); + lblFirstSyncTime.Text = DateTimeToString(device.FirstSyncTime); + lblDeviceWipeRequestTime.Text = DateTimeToString(device.DeviceWipeRequestTime); + lblDeviceAcnowledgeTime.Text = DateTimeToString(device.DeviceWipeAckTime); + lblLastSync.Text = DateTimeToString(device.LastSyncAttemptTime); + lblLastUpdate.Text = DateTimeToString(device.LastPolicyUpdateTime); + lblLastPing.Text = device.LastPingHeartbeat == 0 ? string.Empty : device.LastPingHeartbeat.ToString(); lblDeviceFriendlyName.Text = device.DeviceFriendlyName; lblDeviceId.Text = device.DeviceID; lblDeviceUserAgent.Text = device.DeviceUserAgent; @@ -78,20 +79,22 @@ namespace WebsitePanel.Portal.ExchangeServer UpdateButtons(device.Status); - // form title - ExchangeAccount account = ES.Services.ExchangeServer.GetAccount(PanelRequest.ItemID, PanelRequest.AccountID); - litDisplayName.Text = account.DisplayName; - } + // form title + ExchangeAccount account = ES.Services.ExchangeServer.GetAccount(PanelRequest.ItemID, PanelRequest.AccountID); + litDisplayName.Text = account.DisplayName; + } + } + + private string DateTimeToString(DateTime dateTime) + { + return dateTime == DateTime.MinValue ? string.Empty : dateTime.ToString("g"); } - private string DateTimeToString(DateTime dateTime) - { - return dateTime == DateTime.MinValue ? string.Empty : dateTime.ToString("g"); - } - protected void Page_Load(object sender, EventArgs e) { BindData(); + + } private void UpdateButtons(MobileDeviceStatus status) @@ -111,12 +114,12 @@ namespace WebsitePanel.Portal.ExchangeServer { btnWipeAllData.Visible = false; btnCancel.Visible = false; - } + } } protected void btnBack_Click(object sender, EventArgs e) - { - string str = EditUrl("SpaceID", PanelSecurity.PackageId.ToString(), "mailbox_mobile", + { + string str = EditUrl("SpaceID", PanelSecurity.PackageId.ToString(), "mailbox_mobile", "ItemID=" + PanelRequest.ItemID, "AccountID=" + PanelRequest.AccountID); Response.Redirect(str); diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeMailboxMobileDetails.ascx.designer.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeMailboxMobileDetails.ascx.designer.cs index c0e0ced4..985bf499 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeMailboxMobileDetails.ascx.designer.cs +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeMailboxMobileDetails.ascx.designer.cs @@ -1,10 +1,9 @@ //------------------------------------------------------------------------------ // // This code was generated by a tool. -// Runtime Version:2.0.50727.4927 // // Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. +// the code is regenerated. // //------------------------------------------------------------------------------ diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeMailboxPermissions.ascx.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeMailboxPermissions.ascx.cs index 1c6a3211..7e03f6a8 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeMailboxPermissions.ascx.cs +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeMailboxPermissions.ascx.cs @@ -1,4 +1,4 @@ -// Copyright (c) 2012, Outercurve Foundation. +// Copyright (c) 2011, Outercurve Foundation. // All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, @@ -28,6 +28,7 @@ using System; using WebsitePanel.Providers.HostedSolution; +using WebsitePanel.EnterpriseServer; namespace WebsitePanel.Portal.ExchangeServer { @@ -37,8 +38,9 @@ namespace WebsitePanel.Portal.ExchangeServer { if (!IsPostBack) BindPermissions(); + } - + protected void btnSave_Click(object sender, EventArgs e) { @@ -56,15 +58,15 @@ namespace WebsitePanel.Portal.ExchangeServer sendAsPermission.SetAccounts(mailbox.SendAsAccounts); fullAccessPermission.SetAccounts(mailbox.FullAccessAccounts); } - catch(Exception ex) + catch (Exception ex) { messageBox.ShowErrorMessage("EXCHANGE_GET_MAILBOX_PERMISSIONS", ex); } } - + private void SavePermissions() - { + { try { string[] fullAccess = fullAccessPermission.GetAccounts(); @@ -72,16 +74,16 @@ namespace WebsitePanel.Portal.ExchangeServer int result = ES.Services.ExchangeServer.SetMailboxPermissions(PanelRequest.ItemID, PanelRequest.AccountID, sendAs, fullAccess); - - + + if (result < 0) { messageBox.ShowResultMessage(result); return; } - - + + messageBox.ShowSuccessMessage("EXCHANGE_UPDATE_MAILBOX_PERMISSIONS"); } catch (Exception ex) diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeMailboxPermissions.ascx.designer.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeMailboxPermissions.ascx.designer.cs index fe2d3298..4959b0c5 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeMailboxPermissions.ascx.designer.cs +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeMailboxPermissions.ascx.designer.cs @@ -1,10 +1,9 @@ //------------------------------------------------------------------------------ // // This code was generated by a tool. -// Runtime Version:2.0.50727.1433 // // Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. +// the code is regenerated. // //------------------------------------------------------------------------------ diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeMailboxPlans.ascx b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeMailboxPlans.ascx new file mode 100644 index 00000000..460aa9de --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeMailboxPlans.ascx @@ -0,0 +1,73 @@ +<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="ExchangeMailboxPlans.ascx.cs" Inherits="WebsitePanel.Portal.ExchangeServer.ExchangeMailboxPlans" %> +<%@ Register Src="../UserControls/SimpleMessageBox.ascx" TagName="SimpleMessageBox" TagPrefix="wsp" %> +<%@ Register Src="UserControls/Menu.ascx" TagName="Menu" TagPrefix="wsp" %> +<%@ Register Src="UserControls/Breadcrumb.ascx" TagName="Breadcrumb" TagPrefix="wsp" %> +<%@ Register Src="../UserControls/QuotaViewer.ascx" TagName="QuotaViewer" TagPrefix="wsp" %> +<%@ Register Src="../UserControls/EnableAsyncTasksSupport.ascx" TagName="EnableAsyncTasksSupport" TagPrefix="wsp" %> + + + +
    +
    +
    + +
    +
    + +
    +
    +
    +
    + + +
    +
    + + +
    + +
    + + + + + + + + <%# Eval("MailboxPlan")%> + + + + + +
    + /> +
    +
    +
    + + +   + + +
    +
    +
    +
    + +
    + +
    +
    +
    + +
    +
    +
    +
    \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeMailboxPlans.ascx.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeMailboxPlans.ascx.cs new file mode 100644 index 00000000..3cf6d8d0 --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeMailboxPlans.ascx.cs @@ -0,0 +1,126 @@ +// Copyright (c) 2012, Outercurve Foundation. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// - Redistributions of source code must retain the above copyright notice, this +// list of conditions and the following disclaimer. +// +// - Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// - Neither the name of the Outercurve Foundation nor the names of its +// contributors may be used to endorse or promote products derived from this +// software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +using System; +using System.Web.UI.WebControls; +using WebsitePanel.EnterpriseServer; +using WebsitePanel.Providers.HostedSolution; + +namespace WebsitePanel.Portal.ExchangeServer +{ + public partial class ExchangeMailboxPlans : WebsitePanelModuleBase + { + protected void Page_Load(object sender, EventArgs e) + { + if (!IsPostBack) + { + // bind mailboxplans + BindMailboxPlans(); + } + + } + + public string GetMailboxPlanDisplayUrl(string MailboxPlanId) + { + return EditUrl("SpaceID", PanelSecurity.PackageId.ToString(), "add_mailboxplan", + "MailboxPlanId=" + MailboxPlanId, + "ItemID=" + PanelRequest.ItemID); + } + + + private void BindMailboxPlans() + { + ExchangeMailboxPlan[] list = ES.Services.ExchangeServer.GetExchangeMailboxPlans(PanelRequest.ItemID); + + gvMailboxPlans.DataSource = list; + gvMailboxPlans.DataBind(); + + //check if organization has only one default domain + if (gvMailboxPlans.Rows.Count == 1) + { + btnSetDefaultMailboxPlan.Enabled = false; + } + } + + public string IsChecked(bool val) + { + return val ? "checked" : ""; + } + + protected void btnAddMailboxPlan_Click(object sender, EventArgs e) + { + btnSetDefaultMailboxPlan.Enabled = true; + Response.Redirect(EditUrl("ItemID", PanelRequest.ItemID.ToString(), "add_mailboxplan", + "SpaceID=" + PanelSecurity.PackageId)); + } + + protected void gvMailboxPlan_RowCommand(object sender, GridViewCommandEventArgs e) + { + if (e.CommandName == "DeleteItem") + { + int mailboxPlanId = Utils.ParseInt(e.CommandArgument.ToString(), 0); + + try + { + int result = ES.Services.ExchangeServer.DeleteExchangeMailboxPlan(PanelRequest.ItemID, mailboxPlanId); + + if (result < 0) + { + messageBox.ShowResultMessage(result); + return; + } + + } + catch (Exception) + { + messageBox.ShowErrorMessage("EXCHANGE_DELETE_MAILBOXPLAN"); + } + + BindMailboxPlans(); + } + } + + protected void btnSetDefaultMailboxPlan_Click(object sender, EventArgs e) + { + // get domain + int mailboxPlanId = Utils.ParseInt(Request.Form["DefaultMailboxPlan"], 0); + + try + { + ES.Services.ExchangeServer.SetOrganizationDefaultExchangeMailboxPlan(PanelRequest.ItemID, mailboxPlanId); + + // rebind domains + BindMailboxPlans(); + } + catch (Exception ex) + { + ShowErrorMessage("EXCHANGE_SET_DEFAULT_MAILBOXPLAN", ex); + } + } + } +} \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ProviderControls/Exchange2010SP1_Settings.ascx.designer.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeMailboxPlans.ascx.designer.cs similarity index 53% rename from WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ProviderControls/Exchange2010SP1_Settings.ascx.designer.cs rename to WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeMailboxPlans.ascx.designer.cs index 9eb2d1e9..cd76a5ae 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ProviderControls/Exchange2010SP1_Settings.ascx.designer.cs +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeMailboxPlans.ascx.designer.cs @@ -7,126 +7,99 @@ // //------------------------------------------------------------------------------ -namespace WebsitePanel.Portal.ProviderControls { +namespace WebsitePanel.Portal.ExchangeServer { - public partial class Exchange2010SP1_Settings { + public partial class ExchangeMailboxPlans { /// - /// locOrganizationTemplate control. + /// asyncTasks control. /// /// /// Auto-generated field. /// To modify move field declaration from designer file to code-behind file. /// - protected global::System.Web.UI.WebControls.Localize locOrganizationTemplate; + protected global::WebsitePanel.Portal.EnableAsyncTasksSupport asyncTasks; /// - /// locProgramID control. + /// breadcrumb control. /// /// /// Auto-generated field. /// To modify move field declaration from designer file to code-behind file. /// - protected global::System.Web.UI.WebControls.Localize locProgramID; + protected global::WebsitePanel.Portal.ExchangeServer.UserControls.Breadcrumb breadcrumb; /// - /// programID control. + /// menu control. /// /// /// Auto-generated field. /// To modify move field declaration from designer file to code-behind file. /// - protected global::System.Web.UI.WebControls.TextBox programID; + protected global::WebsitePanel.Portal.ExchangeServer.UserControls.Menu menu; /// - /// requireProgramID control. + /// Image1 control. /// /// /// Auto-generated field. /// To modify move field declaration from designer file to code-behind file. /// - protected global::System.Web.UI.WebControls.RequiredFieldValidator requireProgramID; + protected global::System.Web.UI.WebControls.Image Image1; /// - /// locOfferID control. + /// locTitle control. /// /// /// Auto-generated field. /// To modify move field declaration from designer file to code-behind file. /// - protected global::System.Web.UI.WebControls.Localize locOfferID; + protected global::System.Web.UI.WebControls.Localize locTitle; /// - /// offerID control. + /// messageBox control. /// /// /// Auto-generated field. /// To modify move field declaration from designer file to code-behind file. /// - protected global::System.Web.UI.WebControls.TextBox offerID; + protected global::WebsitePanel.Portal.UserControls.SimpleMessageBox messageBox; /// - /// requireOfferID control. + /// btnAddMailboxPlan control. /// /// /// Auto-generated field. /// To modify move field declaration from designer file to code-behind file. /// - protected global::System.Web.UI.WebControls.RequiredFieldValidator requireOfferID; + protected global::System.Web.UI.WebControls.Button btnAddMailboxPlan; /// - /// locDomainTemplates control. + /// gvMailboxPlans control. /// /// /// Auto-generated field. /// To modify move field declaration from designer file to code-behind file. /// - protected global::System.Web.UI.WebControls.Localize locDomainTemplates; + protected global::System.Web.UI.WebControls.GridView gvMailboxPlans; /// - /// locTemporaryDomain control. + /// btnSetDefaultMailboxPlan control. /// /// /// Auto-generated field. /// To modify move field declaration from designer file to code-behind file. /// - protected global::System.Web.UI.WebControls.Localize locTemporaryDomain; + protected global::System.Web.UI.WebControls.Button btnSetDefaultMailboxPlan; /// - /// temporaryDomain control. + /// FormComments control. /// /// /// Auto-generated field. /// To modify move field declaration from designer file to code-behind file. /// - protected global::System.Web.UI.WebControls.TextBox temporaryDomain; - - /// - /// locEcpURL control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.Localize locEcpURL; - - /// - /// ecpURL control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.TextBox ecpURL; - - /// - /// locEcpURLDescr control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.Localize locEcpURLDescr; + protected global::System.Web.UI.WebControls.Localize FormComments; } } diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeMailboxSetupInstructions.ascx.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeMailboxSetupInstructions.ascx.cs index cd141527..5a868594 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeMailboxSetupInstructions.ascx.cs +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeMailboxSetupInstructions.ascx.cs @@ -32,13 +32,14 @@ using WebsitePanel.EnterpriseServer; namespace WebsitePanel.Portal.ExchangeServer { public partial class ExchangeMailboxSetupInstructions : WebsitePanelModuleBase - { + { protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { BindInstructions(); } + } private void BindInstructions() @@ -56,7 +57,7 @@ namespace WebsitePanel.Portal.ExchangeServer // load user details UserInfo user = ES.Services.Users.GetUserById(package.UserId); txtTo.Text = user.Email; - + } protected void btnSend_Click(object sender, EventArgs e) @@ -81,5 +82,5 @@ namespace WebsitePanel.Portal.ExchangeServer return; } } - } + } } \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeMailboxSetupInstructions.ascx.designer.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeMailboxSetupInstructions.ascx.designer.cs index f66a0fb3..b0cb1cf2 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeMailboxSetupInstructions.ascx.designer.cs +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeMailboxSetupInstructions.ascx.designer.cs @@ -1,22 +1,15 @@ //------------------------------------------------------------------------------ // // This code was generated by a tool. -// Runtime Version:2.0.50727.1378 // // Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. +// the code is regenerated. // //------------------------------------------------------------------------------ namespace WebsitePanel.Portal.ExchangeServer { - /// - /// ExchangeMailboxSetupInstructions class. - /// - /// - /// Auto-generated class. - /// public partial class ExchangeMailboxSetupInstructions { /// diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeMailboxes.ascx b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeMailboxes.ascx index 6abb6ddf..03ffcb8f 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeMailboxes.ascx +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeMailboxes.ascx @@ -31,22 +31,12 @@
    - - 10 - 20 - 50 - - 100 - - - DisplayName - Email - AccountName - - DisplayName + Email + AccountName + Subscriber Number +
    @@ -55,10 +45,10 @@ + DataSourceID="odsAccountsPaged"> - + - + + + protected global::System.Web.UI.WebControls.Panel SearchPanel; - /// - /// ddlPageSize control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.DropDownList ddlPageSize; - /// /// ddlSearchColumn control. /// diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeStorageLimits.ascx b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeStorageLimits.ascx deleted file mode 100644 index 34b14a98..00000000 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeStorageLimits.ascx +++ /dev/null @@ -1,91 +0,0 @@ -<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="ExchangeStorageLimits.ascx.cs" Inherits="WebsitePanel.Portal.ExchangeServer.ExchangeStorageLimits" %> -<%@ Register Src="../UserControls/SimpleMessageBox.ascx" TagName="SimpleMessageBox" TagPrefix="wsp" %> -<%@ Register Src="UserControls/Menu.ascx" TagName="Menu" TagPrefix="wsp" %> -<%@ Register Src="UserControls/SizeBox.ascx" TagName="SizeBox" TagPrefix="wsp" %> -<%@ Register Src="UserControls/DaysBox.ascx" TagName="DaysBox" TagPrefix="wsp" %> -<%@ Register Src="UserControls/Breadcrumb.ascx" TagName="Breadcrumb" TagPrefix="wsp" %> -<%@ Register TagPrefix="wsp" TagName="CollapsiblePanel" Src="../UserControls/CollapsiblePanel.ascx" %> -<%@ Register Src="../UserControls/EnableAsyncTasksSupport.ascx" TagName="EnableAsyncTasksSupport" TagPrefix="wsp" %> - - - -
    -
    -
    - -
    -
    - -
    -
    -
    -
    - - -
    -
    - - - - - - - - - - - - - - - - - - - - - -
    - -
    - -
    - -
    -
    -
    - - - - - - - - - - -
    - -
    -
    -
    - -
    - - - -
    - -
    -
    -
    - -
    -
    -
    -
    \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeStorageLimits.ascx.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeStorageLimits.ascx.cs deleted file mode 100644 index ca7afd16..00000000 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeStorageLimits.ascx.cs +++ /dev/null @@ -1,124 +0,0 @@ -// Copyright (c) 2012, Outercurve Foundation. -// All rights reserved. -// -// Redistribution and use in source and binary forms, with or without modification, -// are permitted provided that the following conditions are met: -// -// - Redistributions of source code must retain the above copyright notice, this -// list of conditions and the following disclaimer. -// -// - Redistributions in binary form must reproduce the above copyright notice, -// this list of conditions and the following disclaimer in the documentation -// and/or other materials provided with the distribution. -// -// - Neither the name of the Outercurve Foundation nor the names of its -// contributors may be used to endorse or promote products derived from this -// software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR -// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON -// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -using System; -using System.Data; -using System.Configuration; -using System.Collections; -using System.Web; -using System.Web.Security; -using System.Web.UI; -using System.Web.UI.WebControls; -using System.Web.UI.WebControls.WebParts; -using System.Web.UI.HtmlControls; - - -using WebsitePanel.Providers.HostedSolution; - -namespace WebsitePanel.Portal.ExchangeServer -{ - public partial class ExchangeStorageLimits : WebsitePanelModuleBase - { - protected void Page_Load(object sender, EventArgs e) - { - if (!IsPostBack) - { - BindLimits(); - } - } - - protected void btnSave_Click(object sender, EventArgs e) - { - SaveLimits(false); - } - - protected void btnSaveApply_Click(object sender, EventArgs e) - { - SaveLimits(true); - } - - private void BindLimits() - { - try - { - // read limits - Organization org = ES.Services.ExchangeServer.GetOrganizationStorageLimits( - PanelRequest.ItemID); - - - // bind data - sizeIssueWarning.ValueKB = org.IssueWarningKB; - sizeProhibitSend.ValueKB = org.ProhibitSendKB; - sizeProhibitSendReceive.ValueKB = org.ProhibitSendReceiveKB; - - daysKeepDeletedItems.ValueDays = org.KeepDeletedItemsDays; - } - catch (Exception ex) - { - messageBox.ShowErrorMessage("EXCHANGE_GET_ORG_LIMITS", ex); - } - } - - private void SaveLimits(bool applyToMailboxes) - { - if (!Page.IsValid) - return; - - try - { - if (((sizeIssueWarning.ValueKB <= sizeProhibitSend.ValueKB && sizeIssueWarning.ValueKB != -1) || sizeProhibitSend.ValueKB == -1) - && ((sizeProhibitSend.ValueKB <= sizeProhibitSendReceive.ValueKB && sizeProhibitSend.ValueKB != -1) || sizeProhibitSendReceive.ValueKB == -1)) - { - // set limits - int result = ES.Services.ExchangeServer.SetOrganizationStorageLimits(PanelRequest.ItemID, - sizeIssueWarning.ValueKB, - sizeProhibitSend.ValueKB, - sizeProhibitSendReceive.ValueKB, - daysKeepDeletedItems.ValueDays, - applyToMailboxes); - - if (result < 0) - { - messageBox.ShowResultMessage(result); - return; - } - - messageBox.ShowSuccessMessage("EXCHANGE_SET_ORG_LIMITS"); - } - else - { - messageBox.ShowErrorMessage("EXCHANGE_SET_ORG_LIMITS_VALIDATION"); - } - } - catch (Exception ex) - { - messageBox.ShowErrorMessage("EXCHANGE_SET_ORG_LIMITS", ex); - } - } - } -} \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeStorageLimits.ascx.designer.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeStorageLimits.ascx.designer.cs deleted file mode 100644 index 47fc5eee..00000000 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeStorageLimits.ascx.designer.cs +++ /dev/null @@ -1,223 +0,0 @@ -//------------------------------------------------------------------------------ -// -// This code was generated by a tool. -// Runtime Version:2.0.50727.3053 -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -//------------------------------------------------------------------------------ - -namespace WebsitePanel.Portal.ExchangeServer { - - - public partial class ExchangeStorageLimits { - - /// - /// asyncTasks control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::WebsitePanel.Portal.EnableAsyncTasksSupport asyncTasks; - - /// - /// breadcrumb control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::WebsitePanel.Portal.ExchangeServer.UserControls.Breadcrumb breadcrumb; - - /// - /// menu control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::WebsitePanel.Portal.ExchangeServer.UserControls.Menu menu; - - /// - /// Image1 control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.Image Image1; - - /// - /// locTitle control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.Localize locTitle; - - /// - /// messageBox control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::WebsitePanel.Portal.UserControls.SimpleMessageBox messageBox; - - /// - /// secStorageLimits control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::WebsitePanel.Portal.CollapsiblePanel secStorageLimits; - - /// - /// StorageLimits control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.Panel StorageLimits; - - /// - /// locWhenSizeExceeds control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.Localize locWhenSizeExceeds; - - /// - /// locIssueWarning control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.Localize locIssueWarning; - - /// - /// sizeIssueWarning control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::WebsitePanel.Portal.ExchangeServer.UserControls.SizeBox sizeIssueWarning; - - /// - /// locProhibitSend control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.Localize locProhibitSend; - - /// - /// sizeProhibitSend control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::WebsitePanel.Portal.ExchangeServer.UserControls.SizeBox sizeProhibitSend; - - /// - /// locProhibitSendReceive control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.Localize locProhibitSendReceive; - - /// - /// sizeProhibitSendReceive control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::WebsitePanel.Portal.ExchangeServer.UserControls.SizeBox sizeProhibitSendReceive; - - /// - /// secDeletionSettings control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::WebsitePanel.Portal.CollapsiblePanel secDeletionSettings; - - /// - /// DeletionSettings control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.Panel DeletionSettings; - - /// - /// locKeepDeletedItems control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.Localize locKeepDeletedItems; - - /// - /// daysKeepDeletedItems control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::WebsitePanel.Portal.ExchangeServer.UserControls.DaysBox daysKeepDeletedItems; - - /// - /// btnSave control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.Button btnSave; - - /// - /// btnSaveApply control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.Button btnSaveApply; - - /// - /// ValidationSummary1 control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.ValidationSummary ValidationSummary1; - - /// - /// FormComments control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.Localize FormComments; - } -} diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeStorageUsage.ascx b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeStorageUsage.ascx index e5cadbd0..5c78089b 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeStorageUsage.ascx +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeStorageUsage.ascx @@ -28,7 +28,7 @@ - + diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeStorageUsage.ascx.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeStorageUsage.ascx.cs index a487897e..6a70ca68 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeStorageUsage.ascx.cs +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeStorageUsage.ascx.cs @@ -29,38 +29,40 @@ using System; using System.Web; using WebsitePanel.Providers.HostedSolution; +using WebsitePanel.EnterpriseServer; namespace WebsitePanel.Portal.ExchangeServer { - public partial class ExchangeStorageUsage : WebsitePanelModuleBase - { - protected void Page_Load(object sender, EventArgs e) - { - if (!IsPostBack) - { - // bind quotas - BindQuotas(); - - - } - } + public partial class ExchangeStorageUsage : WebsitePanelModuleBase + { + protected void Page_Load(object sender, EventArgs e) + { + if (!IsPostBack) + { + // bind quotas + BindQuotas(); - private void BindQuotas() - { - OrganizationStatistics stats = ES.Services.ExchangeServer.GetOrganizationStatistics(PanelRequest.ItemID); - btnUsedSize.Text = stats.UsedDiskSpace.ToString(); - } + } - protected void btnRecalculate_Click(object sender, EventArgs e) - { - ES.Services.ExchangeServer.CalculateOrganizationDiskspace(PanelRequest.ItemID); - } + } + + private void BindQuotas() + { + OrganizationStatistics stats = ES.Services.ExchangeServer.GetOrganizationStatistics(PanelRequest.ItemID); + + btnUsedSize.Text = stats.UsedDiskSpace.ToString(); + } + + protected void btnRecalculate_Click(object sender, EventArgs e) + { + ES.Services.ExchangeServer.CalculateOrganizationDiskspace(PanelRequest.ItemID); + } protected void btnUsedSize_Click(object sender, EventArgs e) { HttpContext.Current.Response.Redirect(EditUrl("ItemID", PanelRequest.ItemID.ToString(), "storage_usage_details", - "SpaceID=" + PanelSecurity.PackageId.ToString())); + "SpaceID=" + PanelSecurity.PackageId.ToString())); } - } + } } \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeStorageUsage.ascx.designer.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeStorageUsage.ascx.designer.cs index 3f32adf0..8e7a159d 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeStorageUsage.ascx.designer.cs +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeStorageUsage.ascx.designer.cs @@ -1,10 +1,9 @@ //------------------------------------------------------------------------------ // // This code was generated by a tool. -// Runtime Version:2.0.50727.1433 // // Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. +// the code is regenerated. // //------------------------------------------------------------------------------ diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeStorageUsageBreakdown.ascx b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeStorageUsageBreakdown.ascx index 40e8b55b..8bcdb3be 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeStorageUsageBreakdown.ascx +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeStorageUsageBreakdown.ascx @@ -53,41 +53,6 @@

    - - - - - - - - - - - -  <%# Utils.FormatDateTime((DateTime)Eval("LastAccessTime"))%> - - -  <%# Utils.FormatDateTime((DateTime)Eval("LastModificationTime")) %> - - - -
    - - - - - - - - - -
    177
    100
    -
    -
    - -
    diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeStorageUsageBreakdown.ascx.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeStorageUsageBreakdown.ascx.cs index 2fdceccc..65246294 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeStorageUsageBreakdown.ascx.cs +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeStorageUsageBreakdown.ascx.cs @@ -38,56 +38,40 @@ using System.Web.UI.WebControls.WebParts; using System.Web.UI.HtmlControls; using WebsitePanel.Providers.HostedSolution; +using WebsitePanel.EnterpriseServer; namespace WebsitePanel.Portal.ExchangeServer { - public partial class ExchangeStorageUsageBreakdown : WebsitePanelModuleBase - { - protected void Page_Load(object sender, EventArgs e) - { - if (!IsPostBack) - { - BindStatistics(); - } - } + public partial class ExchangeStorageUsageBreakdown : WebsitePanelModuleBase + { + protected void Page_Load(object sender, EventArgs e) + { + if (!IsPostBack) + { + BindStatistics(); + } - private void BindStatistics() - { - // total counters - int totalMailboxItems = 0; - int totalMailboxesSizeMB = 0; - int totalFolderItems = 0; - int totalFoldersSizeMB = 0; + } - // mailboxes - ExchangeItemStatistics[] mailboxes = ES.Services.ExchangeServer.GetMailboxesStatistics(PanelRequest.ItemID); - gvMailboxes.DataSource = mailboxes; - gvMailboxes.DataBind(); + private void BindStatistics() + { + // total counters + int totalMailboxItems = 0; + int totalMailboxesSizeMB = 0; - foreach (ExchangeItemStatistics item in mailboxes) - { - totalMailboxItems += item.TotalItems; - totalMailboxesSizeMB += item.TotalSizeMB; - } + // mailboxes + ExchangeItemStatistics[] mailboxes = ES.Services.ExchangeServer.GetMailboxesStatistics(PanelRequest.ItemID); + gvMailboxes.DataSource = mailboxes; + gvMailboxes.DataBind(); - lblTotalMailboxItems.Text = totalMailboxItems.ToString(); - lblTotalMailboxSize.Text = totalMailboxesSizeMB.ToString(); + foreach (ExchangeItemStatistics item in mailboxes) + { + totalMailboxItems += item.TotalItems; + totalMailboxesSizeMB += item.TotalSizeMB; + } - - - // public folders - ExchangeItemStatistics[] folders = ES.Services.ExchangeServer.GetPublicFoldersStatistics(PanelRequest.ItemID); - gvFolders.DataSource = folders; - gvFolders.DataBind(); - - foreach (ExchangeItemStatistics item in folders) - { - totalFolderItems += item.TotalItems; - totalFoldersSizeMB += item.TotalSizeMB; - } - - lblTotalFolderItems.Text = totalFolderItems.ToString(); - lblTotalFolderSize.Text = totalFoldersSizeMB.ToString(); - } - } + lblTotalMailboxItems.Text = totalMailboxItems.ToString(); + lblTotalMailboxSize.Text = totalMailboxesSizeMB.ToString(); + } + } } \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeStorageUsageBreakdown.ascx.designer.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeStorageUsageBreakdown.ascx.designer.cs index 55d38f33..178be03f 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeStorageUsageBreakdown.ascx.designer.cs +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeStorageUsageBreakdown.ascx.designer.cs @@ -1,35 +1,132 @@ //------------------------------------------------------------------------------ // // This code was generated by a tool. -// Runtime Version:2.0.50727.42 // // Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. +// the code is regenerated. // //------------------------------------------------------------------------------ namespace WebsitePanel.Portal.ExchangeServer { + public partial class ExchangeStorageUsageBreakdown { - protected WebsitePanel.Portal.ExchangeServer.UserControls.Breadcrumb breadcrumb; - protected WebsitePanel.Portal.ExchangeServer.UserControls.Menu menu; - protected System.Web.UI.WebControls.Image Image1; - protected System.Web.UI.WebControls.Localize locTitle; - protected WebsitePanel.Portal.UserControls.SimpleMessageBox messageBox; - protected WebsitePanel.Portal.CollapsiblePanel secMailboxesReport; - protected System.Web.UI.WebControls.Panel MailboxesReport; - protected System.Web.UI.WebControls.GridView gvMailboxes; - protected System.Web.UI.WebControls.Localize locTotalMailboxItems; - protected System.Web.UI.WebControls.Label lblTotalMailboxItems; - protected System.Web.UI.WebControls.Localize locTotalMailboxesSize; - protected System.Web.UI.WebControls.Label lblTotalMailboxSize; - protected WebsitePanel.Portal.CollapsiblePanel secPublicFoldersReport; - protected System.Web.UI.WebControls.Panel PublicFoldersReport; - protected System.Web.UI.WebControls.GridView gvFolders; - protected System.Web.UI.WebControls.Localize locTotalFolderItems; - protected System.Web.UI.WebControls.Label lblTotalFolderItems; - protected System.Web.UI.WebControls.Localize locTotalFoldersSize; - protected System.Web.UI.WebControls.Label lblTotalFolderSize; - protected System.Web.UI.WebControls.Localize FormComments; + + /// + /// breadcrumb control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.ExchangeServer.UserControls.Breadcrumb breadcrumb; + + /// + /// menu control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.ExchangeServer.UserControls.Menu menu; + + /// + /// Image1 control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Image Image1; + + /// + /// locTitle control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Localize locTitle; + + /// + /// messageBox control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.UserControls.SimpleMessageBox messageBox; + + /// + /// secMailboxesReport control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.CollapsiblePanel secMailboxesReport; + + /// + /// MailboxesReport control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Panel MailboxesReport; + + /// + /// gvMailboxes control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.GridView gvMailboxes; + + /// + /// locTotalMailboxItems control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Localize locTotalMailboxItems; + + /// + /// lblTotalMailboxItems control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Label lblTotalMailboxItems; + + /// + /// locTotalMailboxesSize control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Localize locTotalMailboxesSize; + + /// + /// lblTotalMailboxSize control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Label lblTotalMailboxSize; + + /// + /// FormComments control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Localize FormComments; } } diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/OrganizationCreateOrganization.ascx b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/OrganizationCreateOrganization.ascx index 4cd6922b..9f2fc04a 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/OrganizationCreateOrganization.ascx +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/OrganizationCreateOrganization.ascx @@ -33,12 +33,13 @@
    - + *
    + + +
    @@ -52,15 +60,6 @@
    - - - - - - -
    - -
    // This code was generated by a tool. -// Runtime Version:2.0.50727.1433 // // Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. +// the code is regenerated. // //------------------------------------------------------------------------------ @@ -94,6 +93,33 @@ namespace WebsitePanel.Portal.HostedSolution { /// protected global::System.Web.UI.WebControls.RequiredFieldValidator valRequireDisplayName; + /// + /// locSubscriberNumber control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Localize locSubscriberNumber; + + /// + /// txtSubscriberNumber control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.TextBox txtSubscriberNumber; + + /// + /// valRequireSubscriberNumber control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.RequiredFieldValidator valRequireSubscriberNumber; + /// /// locAccount control. /// @@ -130,24 +156,6 @@ namespace WebsitePanel.Portal.HostedSolution { /// protected global::WebsitePanel.Portal.PasswordControl password; - /// - /// chkSendInstructions control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.CheckBox chkSendInstructions; - - /// - /// sendInstructionEmail control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::WebsitePanel.Portal.UserControls.EmailControl sendInstructionEmail; - /// /// btnCreate control. /// diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/OrganizationHome.ascx b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/OrganizationHome.ascx index e6dd021e..c4e91458 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/OrganizationHome.ascx +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/OrganizationHome.ascx @@ -54,6 +54,7 @@ Text="Organization Statistics">
    @@ -70,18 +72,6 @@
    - -
    -   -
    @@ -114,25 +104,48 @@
    - + - +
    - -
    -   -
    + +
    + + + +
    + +
    + + + +
    -   + + +
    + + +
    + +

    @@ -83,6 +87,10 @@
    - - +
    diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/OrganizationUserGeneralSettings.ascx.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/OrganizationUserGeneralSettings.ascx.cs index c58697a3..1f2131dd 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/OrganizationUserGeneralSettings.ascx.cs +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/OrganizationUserGeneralSettings.ascx.cs @@ -30,37 +30,51 @@ using System; using WebsitePanel.EnterpriseServer; using WebsitePanel.Providers.HostedSolution; using Microsoft.Security.Application; +using WebsitePanel.Providers.ResultObjects; namespace WebsitePanel.Portal.HostedSolution { - public partial class UserGeneralSettings : WebsitePanelModuleBase - { - protected void Page_Load(object sender, EventArgs e) - { + public partial class UserGeneralSettings : WebsitePanelModuleBase + { + protected void Page_Load(object sender, EventArgs e) + { if (!IsPostBack) { BindSettings(); + } - } + } private void BindSettings() { try { password.SetPackagePolicy(PanelSecurity.PackageId, UserSettings.EXCHANGE_POLICY, "MailboxPasswordPolicy"); - password.EditMode = true; + PasswordPolicyResult passwordPolicy = ES.Services.Organizations.GetPasswordPolicy(PanelRequest.ItemID); + if (passwordPolicy.IsSuccess) + { + password.MinimumLength = passwordPolicy.Value.MinLength; + if (passwordPolicy.Value.IsComplexityEnable) + { + password.MinimumNumbers = 1; + password.MinimumSymbols = 1; + password.MinimumUppercase = 1; + } + } + + password.EditMode = password.ValidationEnabled = false; // get settings OrganizationUser user = ES.Services.Organizations.GetUserGeneralSettings(PanelRequest.ItemID, PanelRequest.AccountID); - litDisplayName.Text = AntiXss.HtmlEncode(user.DisplayName); + litDisplayName.Text = AntiXss.HtmlEncode(user.DisplayName); lblUserDomainName.Text = user.DomainUserName; - + // bind form txtDisplayName.Text = user.DisplayName; - + chkDisable.Checked = user.Disabled; txtFirstName.Text = user.FirstName; @@ -92,17 +106,29 @@ namespace WebsitePanel.Portal.HostedSolution txtExternalEmailAddress.Enabled = user.AccountType == ExchangeAccountType.User; lblUserDomainName.Text = user.DomainUserName; + txtSubscriberNumber.Text = user.SubscriberNumber; + + PackageContext cntx = PackagesHelper.GetCachedPackageContext(PanelSecurity.PackageId); + if (cntx.Quotas.ContainsKey(Quotas.EXCHANGE2007_ISCONSUMER)) + { + if (cntx.Quotas[Quotas.EXCHANGE2007_ISCONSUMER].QuotaAllocatedValue != 1) + { + locSubscriberNumber.Visible = false; + txtSubscriberNumber.Visible = false; + } + } + if (user.Locked) chkLocked.Enabled = true; else chkLocked.Enabled = false; - + chkLocked.Checked = user.Locked; - + } catch (Exception ex) { - messageBox.ShowErrorMessage("ORGANIZATION_GET_USER_SETTINGS", ex); + messageBox.ShowErrorMessage("ORGANIZATION_GET_USER_SETTINGS", ex); } } @@ -111,40 +137,46 @@ namespace WebsitePanel.Portal.HostedSolution if (!Page.IsValid) return; + string pwd = password.Password; + + if (!chkSetPassword.Checked) + pwd = string.Empty; + try { int result = ES.Services.Organizations.SetUserGeneralSettings( PanelRequest.ItemID, PanelRequest.AccountID, txtDisplayName.Text, - password.Password, + pwd, false, chkDisable.Checked, chkLocked.Checked, - + txtFirstName.Text, txtInitials.Text, txtLastName.Text, - + txtAddress.Text, txtCity.Text, txtState.Text, txtZip.Text, country.Country, - + txtJobTitle.Text, txtCompany.Text, txtDepartment.Text, txtOffice.Text, manager.GetAccount(), - + txtBusinessPhone.Text, txtFax.Text, txtHomePhone.Text, txtMobilePhone.Text, txtPager.Text, txtWebPage.Text, - txtNotes.Text, - txtExternalEmailAddress.Text); + txtNotes.Text, + txtExternalEmailAddress.Text, + txtSubscriberNumber.Text); if (result < 0) { @@ -152,16 +184,16 @@ namespace WebsitePanel.Portal.HostedSolution return; } - // update title - litDisplayName.Text = txtDisplayName.Text; + // update title + litDisplayName.Text = txtDisplayName.Text; if (!chkLocked.Checked) chkLocked.Enabled = false; - messageBox.ShowSuccessMessage("ORGANIZATION_UPDATE_USER_SETTINGS"); + messageBox.ShowSuccessMessage("ORGANIZATION_UPDATE_USER_SETTINGS"); } catch (Exception ex) { - messageBox.ShowErrorMessage("ORGANIZATION_UPDATE_USER_SETTINGS", ex); + messageBox.ShowErrorMessage("ORGANIZATION_UPDATE_USER_SETTINGS", ex); } } @@ -169,6 +201,12 @@ namespace WebsitePanel.Portal.HostedSolution { SaveSettings(); } - - } + + protected void chkSetPassword_CheckedChanged(object sender, EventArgs e) + { + + password.EditMode = password.ValidationEnabled = chkSetPassword.Checked; + } + + } } \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/OrganizationUserGeneralSettings.ascx.designer.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/OrganizationUserGeneralSettings.ascx.designer.cs index b2bf2273..aabeb89d 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/OrganizationUserGeneralSettings.ascx.designer.cs +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/OrganizationUserGeneralSettings.ascx.designer.cs @@ -1,10 +1,9 @@ //------------------------------------------------------------------------------ // // This code was generated by a tool. -// Runtime Version:2.0.50727.3053 // // Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. +// the code is regenerated. // //------------------------------------------------------------------------------ @@ -130,6 +129,15 @@ namespace WebsitePanel.Portal.HostedSolution { /// protected global::WebsitePanel.Portal.PasswordControl password; + /// + /// chkSetPassword control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.CheckBox chkSetPassword; + /// /// chkDisable control. /// @@ -202,6 +210,24 @@ namespace WebsitePanel.Portal.HostedSolution { /// protected global::System.Web.UI.WebControls.TextBox txtLastName; + /// + /// locSubscriberNumber control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Localize locSubscriberNumber; + + /// + /// txtSubscriberNumber control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.TextBox txtSubscriberNumber; + /// /// locExternalEmailAddress control. /// diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/OrganizationUserSetupInstructions.ascx.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/OrganizationUserSetupInstructions.ascx.cs index 7ced46ad..64040d7f 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/OrganizationUserSetupInstructions.ascx.cs +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/OrganizationUserSetupInstructions.ascx.cs @@ -40,6 +40,7 @@ namespace WebsitePanel.Portal.ExchangeServer { BindInstructions(); } + } private void BindInstructions() @@ -53,7 +54,7 @@ namespace WebsitePanel.Portal.ExchangeServer PackageInfo package = ES.Services.Packages.GetPackage(PanelSecurity.PackageId); if (package == null) RedirectSpaceHomePage(); - + OrganizationUser account = ES.Services.Organizations.GetUserGeneralSettings(PanelRequest.ItemID, PanelRequest.AccountID); if (account != null) diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/OrganizationUserSetupInstructions.ascx.designer.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/OrganizationUserSetupInstructions.ascx.designer.cs index bc2bafe8..28af5836 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/OrganizationUserSetupInstructions.ascx.designer.cs +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/OrganizationUserSetupInstructions.ascx.designer.cs @@ -1,10 +1,9 @@ //------------------------------------------------------------------------------ // // This code was generated by a tool. -// Runtime Version:2.0.50727.3053 // // Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. +// the code is regenerated. // //------------------------------------------------------------------------------ diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/OrganizationUsers.ascx b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/OrganizationUsers.ascx index ec471992..5554db5d 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/OrganizationUsers.ascx +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/OrganizationUsers.ascx @@ -34,17 +34,11 @@
    - - 10 - 20 - 50 - 100 - DisplayName Email AccountName + Subscriber Number @@ -54,8 +48,14 @@ - + DataSourceID="odsAccountsPaged"> + + + + + + + @@ -67,13 +67,22 @@ + + + + + + + + + - + protected global::System.Web.UI.WebControls.Panel SearchPanel; - /// - /// ddlPageSize control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.DropDownList ddlPageSize; - /// /// ddlSearchColumn control. /// diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/Organizations.ascx.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/Organizations.ascx.cs index 317f24e7..072d101f 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/Organizations.ascx.cs +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/Organizations.ascx.cs @@ -32,53 +32,60 @@ using WebsitePanel.EnterpriseServer; namespace WebsitePanel.Portal.ExchangeServer { - public partial class Organizations : WebsitePanelModuleBase - { - protected void Page_Load(object sender, EventArgs e) - { - // set display preferences - gvOrgs.PageSize = UsersHelper.GetDisplayItemsPerPage(); + public partial class Organizations : WebsitePanelModuleBase + { + protected void Page_Load(object sender, EventArgs e) + { + // set display preferences + gvOrgs.PageSize = UsersHelper.GetDisplayItemsPerPage(); - // visibility - chkRecursive.Visible = (PanelSecurity.SelectedUser.Role != UserRole.User); - gvOrgs.Columns[2].Visible = gvOrgs.Columns[3].Visible = - (PanelSecurity.SelectedUser.Role != UserRole.User) && chkRecursive.Checked; - btnCreate.Enabled = (PanelSecurity.SelectedUser.Role != UserRole.Administrator); - } + // visibility + chkRecursive.Visible = (PanelSecurity.SelectedUser.Role != UserRole.User); + gvOrgs.Columns[2].Visible = gvOrgs.Columns[3].Visible = (PanelSecurity.SelectedUser.Role != UserRole.User) && chkRecursive.Checked; - protected void btnCreate_Click(object sender, EventArgs e) - { - Response.Redirect(EditUrl("SpaceID", PanelSecurity.PackageId.ToString(), "create_organization")); - } + if (PanelSecurity.LoggedUser.Role == UserRole.User) + { + gvOrgs.Columns[2].Visible = gvOrgs.Columns[3].Visible = gvOrgs.Columns[4].Visible = false; + btnCreate.Enabled = false; + } + else + if (gvOrgs.Rows.Count > 0) btnCreate.Enabled = false; - protected void odsOrgsPaged_Selected(object sender, ObjectDataSourceStatusEventArgs e) - { - if (e.Exception != null) - { - messageBox.ShowErrorMessage("GET_ORGS", e.Exception); - e.ExceptionHandled = true; - } - } + } - public string GetOrganizationEditUrl(string itemId) - { - return EditUrl("SpaceID", PanelSecurity.PackageId.ToString(), "organization_home", + protected void btnCreate_Click(object sender, EventArgs e) + { + Response.Redirect(EditUrl("SpaceID", PanelSecurity.PackageId.ToString(), "create_organization")); + } + + protected void odsOrgsPaged_Selected(object sender, ObjectDataSourceStatusEventArgs e) + { + if (e.Exception != null) + { + messageBox.ShowErrorMessage("GET_ORGS", e.Exception); + e.ExceptionHandled = true; + } + } + + public string GetOrganizationEditUrl(string itemId) + { + return EditUrl("SpaceID", PanelSecurity.PackageId.ToString(), "organization_home", "ItemID=" + itemId); - } + } - public string GetUserHomePageUrl(int userId) - { - return PortalUtils.GetUserHomePageUrl(userId); - } + public string GetUserHomePageUrl(int userId) + { + return PortalUtils.GetUserHomePageUrl(userId); + } - public string GetSpaceHomePageUrl(int spaceId) - { - return NavigateURL(PortalUtils.SPACE_ID_PARAM, spaceId.ToString()); - } + public string GetSpaceHomePageUrl(int spaceId) + { + return NavigateURL(PortalUtils.SPACE_ID_PARAM, spaceId.ToString()); + } protected void gvOrgs_RowCommand(object sender, GridViewCommandEventArgs e) { - if (e.CommandName == "DeleteItem") + if (e.CommandName == "DeleteItem") { // delete organization int itemId = Utils.ParseInt(e.CommandArgument.ToString(), 0); @@ -95,13 +102,13 @@ namespace WebsitePanel.Portal.ExchangeServer // rebind grid gvOrgs.DataBind(); - orgsQuota.BindQuota(); + orgsQuota.BindQuota(); } catch (Exception ex) { - messageBox.ShowErrorMessage("DELETE_ORG", ex); + messageBox.ShowErrorMessage("DELETE_ORG", ex); } } } - } + } } \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/Organizations.ascx.designer.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/Organizations.ascx.designer.cs index c6ddeecf..87987213 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/Organizations.ascx.designer.cs +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/Organizations.ascx.designer.cs @@ -1,10 +1,9 @@ //------------------------------------------------------------------------------ // // This code was generated by a tool. -// Runtime Version:2.0.50727.3053 // // Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. +// the code is regenerated. // //------------------------------------------------------------------------------ diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/UserControls/App_LocalResources/MailboxTabs.ascx.resx b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/UserControls/App_LocalResources/MailboxTabs.ascx.resx index a4f425dc..e969fd9b 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/UserControls/App_LocalResources/MailboxTabs.ascx.resx +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/UserControls/App_LocalResources/MailboxTabs.ascx.resx @@ -112,10 +112,10 @@ 2.0 - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 E-mail Addresses @@ -135,15 +135,13 @@ Setup Instructions - - Permissions - - Mobile Devices Spam - + + Mailbox + \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/UserControls/App_LocalResources/Menu.ascx.resx b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/UserControls/App_LocalResources/Menu.ascx.resx index 41d8d98b..91cf60e9 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/UserControls/App_LocalResources/Menu.ascx.resx +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/UserControls/App_LocalResources/Menu.ascx.resx @@ -112,10 +112,10 @@ 2.0 - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 ActiveSync Policy @@ -127,17 +127,15 @@ Distribution Lists - Domain Names + Accepted Domains - + CRM Organization - - - CRM Users - - - + + CRM Users + + Exchange @@ -146,18 +144,16 @@ Organization's - + CRM - - + BlackBerry - - BlackBerry Users - - - + + BlackBerry Users + + Public Folders @@ -166,14 +162,13 @@ SharePoint - + OCS - - + OCS Users - + Site Collections @@ -185,4 +180,7 @@ Users + + Mailbox Plans + \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/UserControls/DomainSelector.ascx.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/UserControls/DomainSelector.ascx.cs index 076c28f1..c56e96da 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/UserControls/DomainSelector.ascx.cs +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/UserControls/DomainSelector.ascx.cs @@ -39,54 +39,54 @@ namespace WebsitePanel.Portal.ExchangeServer.UserControls get { return ddlDomain.SelectedItem.Text; } } - public int DomainId - { - get - { - return Convert.ToInt32(ddlDomain.SelectedValue); - } - } + public int DomainId + { + get + { + return Convert.ToInt32(ddlDomain.SelectedValue); + } + } - public int DomainsCount - { - get - { - return this.ddlDomain.Items.Count; - } - } + public int DomainsCount + { + get + { + return this.ddlDomain.Items.Count; + } + } - public bool ShowAt - { - get - { - return this.litAt.Visible; - } - set - { - this.litAt.Visible = value; - } - } + public bool ShowAt + { + get + { + return this.litAt.Visible; + } + set + { + this.litAt.Visible = value; + } + } protected void Page_Load(object sender, EventArgs e) { - if (!IsPostBack) - { - BindDomains(); - } + if (!IsPostBack) + { + BindDomains(); + } } - private void BindDomains() - { - // get domains - OrganizationDomainName[] domains = ES.Services.Organizations.GetOrganizationDomains(PanelRequest.ItemID); + private void BindDomains() + { + // get domains + OrganizationDomainName[] domains = ES.Services.Organizations.GetOrganizationDomains(PanelRequest.ItemID); - // bind domains - foreach (OrganizationDomainName domain in domains) - { - ListItem li = new ListItem(domain.DomainName, domain.DomainId.ToString()); - li.Selected = domain.IsDefault; - ddlDomain.Items.Add(li); - } - } + // bind domains + foreach (OrganizationDomainName domain in domains) + { + ListItem li = new ListItem(domain.DomainName, domain.DomainId.ToString()); + li.Selected = domain.IsDefault; + ddlDomain.Items.Add(li); + } + } } } \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/UserControls/DomainSelector.ascx.designer.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/UserControls/DomainSelector.ascx.designer.cs index bca58a9f..b4a0e6a6 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/UserControls/DomainSelector.ascx.designer.cs +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/UserControls/DomainSelector.ascx.designer.cs @@ -1,22 +1,15 @@ //------------------------------------------------------------------------------ // // This code was generated by a tool. -// Runtime Version:2.0.50727.832 // // Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. +// the code is regenerated. // //------------------------------------------------------------------------------ namespace WebsitePanel.Portal.ExchangeServer.UserControls { - /// - /// DomainSelector class. - /// - /// - /// Auto-generated class. - /// public partial class DomainSelector { /// diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/UserControls/MailboxPlanSelector.ascx b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/UserControls/MailboxPlanSelector.ascx new file mode 100644 index 00000000..9718d6b2 --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/UserControls/MailboxPlanSelector.ascx @@ -0,0 +1,3 @@ +<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="MailboxPlanSelector.ascx.cs" Inherits="WebsitePanel.Portal.ExchangeServer.UserControls.MailboxPlanSelector" %> + \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/UserControls/MailboxPlanSelector.ascx.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/UserControls/MailboxPlanSelector.ascx.cs new file mode 100644 index 00000000..b2cdfbd3 --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/UserControls/MailboxPlanSelector.ascx.cs @@ -0,0 +1,105 @@ +// Copyright (c) 2012, Outercurve Foundation. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// - Redistributions of source code must retain the above copyright notice, this +// list of conditions and the following disclaimer. +// +// - Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// - Neither the name of the Outercurve Foundation nor the names of its +// contributors may be used to endorse or promote products derived from this +// software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +using System; +using System.Web.UI.WebControls; + +namespace WebsitePanel.Portal.ExchangeServer.UserControls +{ + public partial class MailboxPlanSelector : WebsitePanelControlBase + { + + private string mailboxPlanToSelect; + + public string MailboxPlanId + { + + get { return ddlMailboxPlan.SelectedItem.Value; } + set + { + mailboxPlanToSelect = value; + foreach (ListItem li in ddlMailboxPlan.Items) + { + if (li.Value == value) + { + ddlMailboxPlan.ClearSelection(); + li.Selected = true; + break; + } + } + } + } + + public int MailboxPlansCount + { + get + { + return this.ddlMailboxPlan.Items.Count; + } + } + + + protected void Page_Load(object sender, EventArgs e) + { + if (!IsPostBack) + { + BindMailboxPlans(); + } + } + + private void BindMailboxPlans() + { + WebsitePanel.Providers.HostedSolution.ExchangeMailboxPlan[] plans = ES.Services.ExchangeServer.GetExchangeMailboxPlans(PanelRequest.ItemID); + + foreach (WebsitePanel.Providers.HostedSolution.ExchangeMailboxPlan plan in plans) + { + ListItem li = new ListItem(); + li.Text = plan.MailboxPlan; + li.Value = plan.MailboxPlanId.ToString(); + li.Selected = plan.IsDefault; + ddlMailboxPlan.Items.Add(li); + } + + foreach (ListItem li in ddlMailboxPlan.Items) + { + if (li.Value == mailboxPlanToSelect) + { + ddlMailboxPlan.ClearSelection(); + li.Selected = true; + break; + } + } + + } + + protected void ddlMailboxPlan_SelectedIndexChanged(object sender, EventArgs e) + { + + } + } +} \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/UserControls/MailboxSelector.ascx.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/UserControls/MailboxSelector.ascx.cs index 60a4aa40..62431785 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/UserControls/MailboxSelector.ascx.cs +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/UserControls/MailboxSelector.ascx.cs @@ -37,24 +37,24 @@ namespace WebsitePanel.Portal.ExchangeServer.UserControls public partial class MailboxSelector : WebsitePanelControlBase { public const string DirectionString = "DirectionString"; - + public bool MailboxesEnabled - { - get { return ViewState["MailboxesEnabled"] != null ? (bool)ViewState["MailboxesEnabled"] : false; } - set { ViewState["MailboxesEnabled"] = value; } - } + { + get { return ViewState["MailboxesEnabled"] != null ? (bool)ViewState["MailboxesEnabled"] : false; } + set { ViewState["MailboxesEnabled"] = value; } + } - public bool ContactsEnabled - { - get { return ViewState["ContactsEnabled"] != null ? (bool)ViewState["ContactsEnabled"] : false; } - set { ViewState["ContactsEnabled"] = value; } - } + public bool ContactsEnabled + { + get { return ViewState["ContactsEnabled"] != null ? (bool)ViewState["ContactsEnabled"] : false; } + set { ViewState["ContactsEnabled"] = value; } + } - public bool DistributionListsEnabled - { - get { return ViewState["DistributionListsEnabled"] != null ? (bool)ViewState["DistributionListsEnabled"] : false; } - set { ViewState["DistributionListsEnabled"] = value; } - } + public bool DistributionListsEnabled + { + get { return ViewState["DistributionListsEnabled"] != null ? (bool)ViewState["DistributionListsEnabled"] : false; } + set { ViewState["DistributionListsEnabled"] = value; } + } public bool ShowOnlyMailboxes { @@ -62,20 +62,20 @@ namespace WebsitePanel.Portal.ExchangeServer.UserControls set { ViewState["ShowOnlyMailboxes"] = value; } } - public int ExcludeAccountId - { - get { return PanelRequest.AccountID; } - } + public int ExcludeAccountId + { + get { return PanelRequest.AccountID; } + } - public void SetAccount(ExchangeAccount account) - { - BindSelectedAccount(account); - } + public void SetAccount(ExchangeAccount account) + { + BindSelectedAccount(account); + } - public string GetAccount() - { - return (string)ViewState["AccountName"]; - } + public string GetAccount() + { + return (string)ViewState["AccountName"]; + } public int GetAccountId() { return Utils.ParseInt(ViewState["AccountId"], 0); @@ -84,11 +84,11 @@ namespace WebsitePanel.Portal.ExchangeServer.UserControls protected void Page_Load(object sender, EventArgs e) { - // toggle controls - if (!IsPostBack) - { + // toggle controls + if (!IsPostBack) + { chkIncludeMailboxes.Visible = MailboxesEnabled; - + chkIncludeRooms.Visible = MailboxesEnabled && !ShowOnlyMailboxes; chkIncludeEquipment.Visible = MailboxesEnabled && !ShowOnlyMailboxes; @@ -98,47 +98,47 @@ namespace WebsitePanel.Portal.ExchangeServer.UserControls chkIncludeRooms.Checked = MailboxesEnabled && !ShowOnlyMailboxes; chkIncludeEquipment.Checked = MailboxesEnabled && !ShowOnlyMailboxes; - + chkIncludeContacts.Visible = ContactsEnabled; - chkIncludeContacts.Checked = ContactsEnabled; - chkIncludeLists.Visible = DistributionListsEnabled; - chkIncludeLists.Checked = DistributionListsEnabled; - } + chkIncludeContacts.Checked = ContactsEnabled; + chkIncludeLists.Visible = DistributionListsEnabled; + chkIncludeLists.Checked = DistributionListsEnabled; + } } - private void BindSelectedAccount(ExchangeAccount account) - { - if (account != null) - { - txtDisplayName.Text = account.DisplayName; - ViewState["AccountName"] = account.AccountName; + private void BindSelectedAccount(ExchangeAccount account) + { + if (account != null) + { + txtDisplayName.Text = account.DisplayName; + ViewState["AccountName"] = account.AccountName; ViewState["PrimaryEmailAddress"] = account.PrimaryEmailAddress; ViewState["AccountId"] = account.AccountId; - } - else - { - txtDisplayName.Text = ""; - ViewState["AccountName"] = null; + } + else + { + txtDisplayName.Text = ""; + ViewState["AccountName"] = null; ViewState["PrimaryEmailAddress"] = null; ViewState["AccountId"] = null; - } - } + } + } - public string GetAccountImage(int accountTypeId) - { - ExchangeAccountType accountType = (ExchangeAccountType)accountTypeId; - string imgName = "mailbox_16.gif"; - if (accountType == ExchangeAccountType.Contact) - imgName = "contact_16.gif"; - else if (accountType == ExchangeAccountType.DistributionList) - imgName = "dlist_16.gif"; + public string GetAccountImage(int accountTypeId) + { + ExchangeAccountType accountType = (ExchangeAccountType)accountTypeId; + string imgName = "mailbox_16.gif"; + if (accountType == ExchangeAccountType.Contact) + imgName = "contact_16.gif"; + else if (accountType == ExchangeAccountType.DistributionList) + imgName = "dlist_16.gif"; else if (accountType == ExchangeAccountType.Room) imgName = "room_16.gif"; else if (accountType == ExchangeAccountType.Equipment) imgName = "equipment_16.gif"; - return GetThemedImage("Exchange/" + imgName); - } + return GetThemedImage("Exchange/" + imgName); + } private SortDirection Direction @@ -152,26 +152,26 @@ namespace WebsitePanel.Portal.ExchangeServer.UserControls return string.Compare(user1.DisplayName, user2.DisplayName); } - + private void BindPopupAccounts() - { - ExchangeAccount[] accounts = ES.Services.ExchangeServer.SearchAccounts(PanelRequest.ItemID, - chkIncludeMailboxes.Checked, chkIncludeContacts.Checked, chkIncludeLists.Checked, + { + ExchangeAccount[] accounts = ES.Services.ExchangeServer.SearchAccounts(PanelRequest.ItemID, + chkIncludeMailboxes.Checked, chkIncludeContacts.Checked, chkIncludeLists.Checked, chkIncludeRooms.Checked, chkIncludeEquipment.Checked, - ddlSearchColumn.SelectedValue, txtSearchValue.Text + "%", ""); + ddlSearchColumn.SelectedValue, txtSearchValue.Text + "%", ""); - if (ExcludeAccountId > 0) - { - List updatedAccounts = new List(); - foreach (ExchangeAccount account in accounts) - if (account.AccountId != ExcludeAccountId) - updatedAccounts.Add(account); + if (ExcludeAccountId > 0) + { + List updatedAccounts = new List(); + foreach (ExchangeAccount account in accounts) + if (account.AccountId != ExcludeAccountId) + updatedAccounts.Add(account); - accounts = updatedAccounts.ToArray(); - } + accounts = updatedAccounts.ToArray(); + } Array.Sort(accounts, CompareAccount); - + if (Direction == SortDirection.Ascending) { Array.Reverse(accounts); @@ -182,56 +182,56 @@ namespace WebsitePanel.Portal.ExchangeServer.UserControls gvPopupAccounts.DataSource = accounts; gvPopupAccounts.DataBind(); - - - } - protected void chkIncludeMailboxes_CheckedChanged(object sender, EventArgs e) - { - BindPopupAccounts(); - } - protected void cmdSearch_Click(object sender, ImageClickEventArgs e) - { - BindPopupAccounts(); - } + } - protected void cmdClear_Click(object sender, EventArgs e) - { - BindSelectedAccount(null); - } + protected void chkIncludeMailboxes_CheckedChanged(object sender, EventArgs e) + { + BindPopupAccounts(); + } - protected void ImageButton1_Click(object sender, ImageClickEventArgs e) - { - // bind all accounts - BindPopupAccounts(); + protected void cmdSearch_Click(object sender, ImageClickEventArgs e) + { + BindPopupAccounts(); + } - // show modal - SelectAccountsModal.Show(); - } + protected void cmdClear_Click(object sender, EventArgs e) + { + BindSelectedAccount(null); + } - protected void gvPopupAccounts_RowCommand(object sender, GridViewCommandEventArgs e) - { - if (e.CommandName == "SelectAccount") - { - string[] parts = e.CommandArgument.ToString().Split('|'); - ExchangeAccount account = new ExchangeAccount(); - account.AccountName = parts[0]; - account.DisplayName = parts[1]; + protected void ImageButton1_Click(object sender, ImageClickEventArgs e) + { + // bind all accounts + BindPopupAccounts(); + + // show modal + SelectAccountsModal.Show(); + } + + protected void gvPopupAccounts_RowCommand(object sender, GridViewCommandEventArgs e) + { + if (e.CommandName == "SelectAccount") + { + string[] parts = e.CommandArgument.ToString().Split('|'); + ExchangeAccount account = new ExchangeAccount(); + account.AccountName = parts[0]; + account.DisplayName = parts[1]; account.PrimaryEmailAddress = parts[2]; account.AccountId = Utils.ParseInt(parts[3]); - // set account - BindSelectedAccount(account); + // set account + BindSelectedAccount(account); - // hide popup - SelectAccountsModal.Hide(); + // hide popup + SelectAccountsModal.Hide(); - // update parent panel - MainUpdatePanel.Update(); - } - } + // update parent panel + MainUpdatePanel.Update(); + } + } protected void OnSorting(object sender, GridViewSortEventArgs e) { diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/UserControls/MailboxSelector.ascx.designer.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/UserControls/MailboxSelector.ascx.designer.cs index d19fbb89..4c796a4c 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/UserControls/MailboxSelector.ascx.designer.cs +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/UserControls/MailboxSelector.ascx.designer.cs @@ -1,10 +1,9 @@ //------------------------------------------------------------------------------ // // This code was generated by a tool. -// Runtime Version:2.0.50727.4927 // // Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. +// the code is regenerated. // //------------------------------------------------------------------------------ diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/UserControls/MailboxTabs.ascx.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/UserControls/MailboxTabs.ascx.cs index f2ec5079..5994422d 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/UserControls/MailboxTabs.ascx.cs +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/UserControls/MailboxTabs.ascx.cs @@ -90,11 +90,10 @@ namespace WebsitePanel.Portal.ExchangeServer.UserControls private void BindTabs() { List tabsList = new List(); - tabsList.Add(CreateTab("mailbox_settings", "Tab.Settings")); + tabsList.Add(CreateTab("mailbox_settings", "Tab.Mailbox")); tabsList.Add(CreateTab("mailbox_addresses", "Tab.Addresses")); tabsList.Add(CreateTab("mailbox_mailflow", "Tab.Mailflow")); tabsList.Add(CreateTab("mailbox_permissions", "Tab.Permissions")); - tabsList.Add(CreateTab("mailbox_advanced", "Tab.Advanced")); tabsList.Add(CreateTab("mailbox_setup", "Tab.Setup")); tabsList.Add(CreateTab("mailbox_mobile", "Tab.Mobile")); //tabsList.Add(CreateTab("mailbddox_spam", "Tab.Spam")); diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/UserControls/Menu.ascx.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/UserControls/Menu.ascx.cs index 8ff532c6..baa30d3a 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/UserControls/Menu.ascx.cs +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/UserControls/Menu.ascx.cs @@ -126,14 +126,17 @@ namespace WebsitePanel.Portal.ExchangeServer.UserControls if (CheckQouta(Quotas.EXCHANGE2007_PUBLICFOLDERS, cntx)) exchangeGroup.MenuItems.Add(CreateMenuItem("PublicFolders", "public_folders")); - - - exchangeGroup.MenuItems.Add(CreateMenuItem("StorageUsage", "storage_usage")); - exchangeGroup.MenuItems.Add(CreateMenuItem("StorageLimits", "storage_limits")); - - if (CheckQouta(Quotas.EXCHANGE2007_ACTIVESYNCENABLED, cntx)) + if (CheckQouta(Quotas.EXCHANGE2007_ACTIVESYNCALLOWED, cntx)) exchangeGroup.MenuItems.Add(CreateMenuItem("ActiveSyncPolicy", "activesync_policy")); + if (CheckQouta(Quotas.EXCHANGE2007_MAILBOXES, cntx)) + exchangeGroup.MenuItems.Add(CreateMenuItem("MailboxPlans", "mailboxplans")); + + if (CheckQouta(Quotas.ORGANIZATION_DOMAINS, cntx)) + exchangeGroup.MenuItems.Add(CreateMenuItem("DomainNames", "domains")); + + exchangeGroup.MenuItems.Add(CreateMenuItem("StorageUsage", "storage_usage")); + if (exchangeGroup.MenuItems.Count > 0) groups.Add(exchangeGroup); @@ -142,8 +145,8 @@ namespace WebsitePanel.Portal.ExchangeServer.UserControls private void PrepareOrganizationMenu(PackageContext cntx, List groups, string imagePath) { MenuGroup organizationGroup = new MenuGroup(GetLocalizedString("Text.OrganizationGroup"), imagePath + "company24.png"); - if (CheckQouta(Quotas.ORGANIZATION_DOMAINS, cntx)) - organizationGroup.MenuItems.Add(CreateMenuItem("DomainNames", "domains")); + //if (CheckQouta(Quotas.ORGANIZATION_DOMAINS, cntx)) + // organizationGroup.MenuItems.Add(CreateMenuItem("DomainNames", "domains")); if (CheckQouta(Quotas.ORGANIZATION_USERS, cntx)) organizationGroup.MenuItems.Add(CreateMenuItem("Users", "users")); diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/UserControls/SizeBox.ascx b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/UserControls/SizeBox.ascx index 8aef6ce4..dc4977d2 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/UserControls/SizeBox.ascx +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/UserControls/SizeBox.ascx @@ -1,6 +1,8 @@ <%@ Control Language="C#" AutoEventWireup="true" CodeBehind="SizeBox.ascx.cs" Inherits="WebsitePanel.Portal.ExchangeServer.UserControls.SizeBox" %> + + // This code was generated by a tool. -// Runtime Version:2.0.50727.312 // // Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. +// the code is regenerated. // //------------------------------------------------------------------------------ namespace WebsitePanel.Portal.ExchangeServer.UserControls { - /// - /// SizeBox class. - /// - /// - /// Auto-generated class. - /// public partial class SizeBox { /// @@ -37,6 +30,42 @@ namespace WebsitePanel.Portal.ExchangeServer.UserControls { /// protected global::System.Web.UI.WebControls.Localize locKB; + /// + /// locMB control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Localize locMB; + + /// + /// locPct control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Localize locPct; + + /// + /// _ValidatorCalloutExtender control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::AjaxControlToolkit.ValidatorCalloutExtender _ValidatorCalloutExtender; + + /// + /// ValidatorCalloutExtender1 control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::AjaxControlToolkit.ValidatorCalloutExtender ValidatorCalloutExtender1; + /// /// valRequireNumber control. /// diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/UserControls/UserSelector.ascx b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/UserControls/UserSelector.ascx index 1abeb777..a5c22ab2 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/UserControls/UserSelector.ascx +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/UserControls/UserSelector.ascx @@ -49,7 +49,7 @@ diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/UserControls/UserSelector.ascx.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/UserControls/UserSelector.ascx.cs index 51e5e543..da7d0b53 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/UserControls/UserSelector.ascx.cs +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/UserControls/UserSelector.ascx.cs @@ -11,7 +11,7 @@ // this list of conditions and the following disclaimer in the documentation // and/or other materials provided with the distribution. // -// - Neither the name of the Outercurve Foundation nor the names of its +// - Neither the name of the SMB SAAS Systems Inc. nor the names of its // contributors may be used to endorse or promote products derived from this // software without specific prior written permission. // @@ -137,6 +137,12 @@ namespace WebsitePanel.Portal.ExchangeServer.UserControls return (string)ViewState["PrimaryEmailAddress"]; } + public string GetSubscriberNumber() + { + return (string)ViewState["SubscriberNumber"]; + } + + public int GetAccountId() { return Utils.ParseInt(ViewState["AccountId"], 0); @@ -158,6 +164,7 @@ namespace WebsitePanel.Portal.ExchangeServer.UserControls ViewState["PrimaryEmailAddress"] = account.PrimaryEmailAddress; ViewState["AccountId"] = account.AccountId; ViewState["SAMAccountName"] = account.SamAccountName; + ViewState["SubscriberNumber"] = account.SubscriberNumber; } else { @@ -167,7 +174,7 @@ namespace WebsitePanel.Portal.ExchangeServer.UserControls ViewState["PrimaryEmailAddress"] = null; ViewState["AccountId"] = null; ViewState["SAMAccountName"] = null; - + ViewState["SubscriberNumber"] = null; } } @@ -287,6 +294,7 @@ namespace WebsitePanel.Portal.ExchangeServer.UserControls account.PrimaryEmailAddress = parts[2]; account.AccountId = Utils.ParseInt(parts[3]); account.SamAccountName = parts[4]; + account.SubscriberNumber = parts[5]; // set account BindSelectedAccount(account); diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/UserControls/UserSelector.ascx.designer.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/UserControls/UserSelector.ascx.designer.cs index c4fe285f..4775df9a 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/UserControls/UserSelector.ascx.designer.cs +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/UserControls/UserSelector.ascx.designer.cs @@ -1,31 +1,3 @@ -// Copyright (c) 2012, Outercurve Foundation. -// All rights reserved. -// -// Redistribution and use in source and binary forms, with or without modification, -// are permitted provided that the following conditions are met: -// -// - Redistributions of source code must retain the above copyright notice, this -// list of conditions and the following disclaimer. -// -// - Redistributions in binary form must reproduce the above copyright notice, -// this list of conditions and the following disclaimer in the documentation -// and/or other materials provided with the distribution. -// -// - Neither the name of the Outercurve Foundation nor the names of its -// contributors may be used to endorse or promote products derived from this -// software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR -// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON -// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - //------------------------------------------------------------------------------ // // This code was generated by a tool. diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ProviderControls/App_LocalResources/Exchange_Settings.ascx.resx b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ProviderControls/App_LocalResources/Exchange_Settings.ascx.resx index ac2e6bc8..c2df5d53 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ProviderControls/App_LocalResources/Exchange_Settings.ascx.resx +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ProviderControls/App_LocalResources/Exchange_Settings.ascx.resx @@ -112,10 +112,10 @@ 2.0 - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Setup Instruction Variables @@ -189,4 +189,7 @@ Public Folder Server: + + Database Availability Group: + \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ProviderControls/Exchange2010SP1_Settings.ascx b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ProviderControls/Exchange2010SP1_Settings.ascx deleted file mode 100644 index de4edd16..00000000 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ProviderControls/Exchange2010SP1_Settings.ascx +++ /dev/null @@ -1,63 +0,0 @@ -<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="Exchange2010SP1_Settings.ascx.cs" Inherits="WebsitePanel.Portal.ProviderControls.Exchange2010SP1_Settings" %> - -
    - Organization Template - - - - - - - - - - <%-- - - - - - --%> -
    Program ID: - - -
    Offer ID: - - -
    Location: - - - -
    -
    - -<%-- -
    - Catch-All - - - - - -
    Catch-all configuration path:
    -
    ---%> - -
    - Domain Templates - - - - - - - - - -
    Temporary domain:organization_domain.
    Exchange Control Panel URL: -
    - You can use [DOMAIN_NAME] variable for organization default domain. -
    -
    \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ProviderControls/Exchange2010SP1_Settings.ascx.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ProviderControls/Exchange2010SP1_Settings.ascx.cs deleted file mode 100644 index 8897a13b..00000000 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ProviderControls/Exchange2010SP1_Settings.ascx.cs +++ /dev/null @@ -1,41 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Web; -using System.Web.UI; -using System.Web.UI.WebControls; -using System.Collections.Specialized; - -namespace WebsitePanel.Portal.ProviderControls -{ - public partial class Exchange2010SP1_Settings : WebsitePanelControlBase, IHostingServiceProviderSettings - { - protected void Page_Load(object sender, EventArgs e) - { - - } - - public void BindSettings(StringDictionary settings) - { - programID.Text = settings["programID"]; - offerID.Text = settings["offerID"]; - //location.Text = settings["location"]; - - //catchAllPath.Text = settings["catchAllPath"]; - - temporaryDomain.Text = settings["temporaryDomain"]; - ecpURL.Text = settings["ecpURL"]; - } - - public void SaveSettings(StringDictionary settings) - { - settings["programID"] = programID.Text.Trim(); - settings["offerID"] = offerID.Text.Trim(); - //settings["location"] = location.Text.Trim(); - - //settings["catchAllPath"] = catchAllPath.Text.Trim(); - - settings["temporaryDomain"] = temporaryDomain.Text.Trim(); - settings["ecpURL"] = ecpURL.Text.Trim(); - } - } -} \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ProviderControls/Exchange_Settings.ascx b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ProviderControls/Exchange_Settings.ascx index 16480e8d..48636a4d 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ProviderControls/Exchange_Settings.ascx +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ProviderControls/Exchange_Settings.ascx @@ -13,11 +13,14 @@ + + // This code was generated by a tool. -// Runtime Version:2.0.50727.3053 // // Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. +// the code is regenerated. //
    //------------------------------------------------------------------------------ @@ -49,6 +48,15 @@ namespace WebsitePanel.Portal.ProviderControls { /// protected global::System.Web.UI.WebControls.Localize locMailboxDatabase; + /// + /// locMailboxDAG control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Localize locMailboxDAG; + /// /// txtMailboxDatabase control. /// diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/UserCreateSpace.ascx b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/UserCreateSpace.ascx index 5f62fea9..b436336c 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/UserCreateSpace.ascx +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/UserCreateSpace.ascx @@ -51,6 +51,14 @@ Text="Create Space Resources" Checked="True" AutoPostBack="True" OnCheckedChanged="chkCreateResources_CheckedChanged" /> + + +
    + + + + diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/UserCreateSpace.ascx.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/UserCreateSpace.ascx.cs index 793b42f9..f6ada2d5 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/UserCreateSpace.ascx.cs +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/UserCreateSpace.ascx.cs @@ -41,6 +41,7 @@ namespace WebsitePanel.Portal { if (!IsPostBack) { + chkIntegratedOUProvisioning.Visible = false; ftpAccountName.SetUserPolicy(PanelSecurity.SelectedUserId, UserSettings.FTP_POLICY, "UserNamePolicy"); BindHostingPlans(PanelSecurity.SelectedUserId); BindHostingPlan(); @@ -106,6 +107,8 @@ namespace WebsitePanel.Portal chkCreateMailAccount.Checked &= mailEnabled; ftpAccountName.Visible = (rbFtpAccountName.SelectedIndex == 1); + + chkIntegratedOUProvisioning.Visible = chkCreateResources.Visible; } private void CreateHostingSpace() @@ -136,6 +139,28 @@ namespace WebsitePanel.Portal lblMessage.Text = AntiXss.HtmlEncode(GetExceedingQuotasMessage(result.ExceedingQuotas)); return; } + else + { + if ((chkIntegratedOUProvisioning.Checked) & !string.IsNullOrEmpty(domainName)) + { + UserInfo user = UsersHelper.GetUser(PanelSecurity.SelectedUserId); + + if (user != null) + { + if (user.Role != UserRole.Reseller) + { + + ES.Services.Organizations.CreateOrganization(result.Result, domainName.ToLower(), domainName.ToLower()); + + if (result.Result < 0) + { + ShowErrorMessage("USERWIZARD_CREATE_ACCOUNT"); + return; + } + } + } + } + } } catch (Exception ex) { diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/UserCreateSpace.ascx.designer.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/UserCreateSpace.ascx.designer.cs index b280ff7a..e41d8992 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/UserCreateSpace.ascx.designer.cs +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/UserCreateSpace.ascx.designer.cs @@ -1,10 +1,9 @@ //------------------------------------------------------------------------------ // // This code was generated by a tool. -// Runtime Version:2.0.50727.3074 // // Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. +// the code is regenerated. // //------------------------------------------------------------------------------ @@ -112,6 +111,15 @@ namespace WebsitePanel.Portal { /// protected global::System.Web.UI.WebControls.CheckBox chkCreateResources; + /// + /// chkIntegratedOUProvisioning control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.CheckBox chkIntegratedOUProvisioning; + /// /// ResourcesPanel control. /// diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/WebsitePanel.Portal.Modules.csproj b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/WebsitePanel.Portal.Modules.csproj index 2bc48ea9..6c2fe5c9 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/WebsitePanel.Portal.Modules.csproj +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/WebsitePanel.Portal.Modules.csproj @@ -199,10 +199,31 @@ + + ExchangeAddMailboxPlan.ascx + ASPXCodeBehind + + + ExchangeAddMailboxPlan.ascx + + + ExchangeMailboxPlans.ascx + ASPXCodeBehind + + + ExchangeMailboxPlans.ascx + AccountsListWithPermissions.ascx ASPXCodeBehind + + MailboxPlanSelector.ascx + ASPXCodeBehind + + + MailboxPlanSelector.ascx + hMailServer5_EditAccount.ascx ASPXCodeBehind @@ -745,13 +766,6 @@ BlackBerry_Settings.ascx - - Exchange2010SP1_Settings.ascx - ASPXCodeBehind - - - Exchange2010SP1_Settings.ascx - Exchange_Settings.ascx ASPXCodeBehind @@ -1189,13 +1203,6 @@ ExchangeDomainRecords.ascx - - ExchangeMailboxAdvancedSettings.ascx - ASPXCodeBehind - - - ExchangeMailboxAdvancedSettings.ascx - ExchangeMailboxEmailAddresses.ascx ASPXCodeBehind @@ -1259,13 +1266,6 @@ ExchangePublicFolders.ascx - - ExchangeStorageLimits.ascx - ASPXCodeBehind - - - ExchangeStorageLimits.ascx - ExchangeStorageUsage.ascx ASPXCodeBehind @@ -3686,7 +3686,10 @@ + + + @@ -3736,7 +3739,6 @@ - @@ -4685,9 +4687,6 @@ Designer - - Designer - Designer @@ -4812,6 +4811,8 @@ Designer + + Designer @@ -5193,9 +5194,6 @@ Designer - - Designer - Designer @@ -5233,7 +5231,6 @@ - @@ -5243,7 +5240,6 @@ - @@ -5345,9 +5341,6 @@ Designer - - Designer - Designer diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/WebsitePanel.WebPortal.csproj b/WebsitePanel/Sources/WebsitePanel.WebPortal/WebsitePanel.WebPortal.csproj index 00a1c8b1..753293c1 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/WebsitePanel.WebPortal.csproj +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/WebsitePanel.WebPortal.csproj @@ -102,7 +102,10 @@ + + + diff --git a/WebsitePanel/Sources/generate_es_proxies.bat b/WebsitePanel/Sources/generate_es_proxies.bat index 1b2bb0fa..d190a83a 100644 --- a/WebsitePanel/Sources/generate_es_proxies.bat +++ b/WebsitePanel/Sources/generate_es_proxies.bat @@ -1,6 +1,6 @@ SET WSDL="C:\Program Files (x86)\Microsoft WSE\v3.0\Tools\WseWsdl3.exe" SET WSE_CLEAN=..\Tools\WseClean.exe -SET SERVER_URL=http://localhost:9002 +SET SERVER_URL=http://localhost:9005 -%WSDL% %SERVER_URL%/esExchangeHostedEdition.asmx /out:.\WebsitePanel.EnterpriseServer.Client\ExchangeHostedEditionProxy.cs /namespace:WebsitePanel.EnterpriseServer /type:webClient -%WSE_CLEAN% .\WebsitePanel.EnterpriseServer.Client\ExchangeHostedEditionProxy.cs \ No newline at end of file +%WSDL% %SERVER_URL%/esExchangeServer.asmx /out:.\WebsitePanel.EnterpriseServer.Client\ExchangeServerProxy.cs /namespace:WebsitePanel.EnterpriseServer /type:webClient +%WSE_CLEAN% .\WebsitePanel.EnterpriseServer.Client\ExchangeServerProxy.cs diff --git a/WebsitePanel/Sources/generate_server_proxies.bat b/WebsitePanel/Sources/generate_server_proxies.bat index 67384691..ee8580af 100644 --- a/WebsitePanel/Sources/generate_server_proxies.bat +++ b/WebsitePanel/Sources/generate_server_proxies.bat @@ -1,8 +1,8 @@ SET WSDL="C:\Program Files (x86)\Microsoft WSE\v3.0\Tools\WseWsdl3.exe" SET WSE_CLEAN=..\Tools\WseClean.exe -SET SERVER_URL=http://localhost:9003 +SET SERVER_URL=http://localhost:9006 -%WSDL% %SERVER_URL%/VirtualizationServerForPrivateCloud.asmx /out:.\WebsitePanel.Server.Client\VirtualizationServerForPrivateCloudProxy.cs /namespace:WebsitePanel.Providers.VirtualizationForPC /type:webClient /fields -%WSE_CLEAN% .\WebsitePanel.Server.Client\VirtualizationServerForPrivateCloudProxy.cs +%WSDL% %SERVER_URL%/Organizations.asmx /out:.\WebsitePanel.Server.Client\OrganizationProxy.cs /namespace:WebsitePanel.Providers.HostedSolution /type:webClient /fields +%WSE_CLEAN% .\WebsitePanel.Server.Client\OrganizationProxy.cs pause \ No newline at end of file From 3732b2143c42773f61edd3e26fac290c5cd804b4 Mon Sep 17 00:00:00 2001 From: robvde Date: Mon, 9 Jul 2012 12:04:19 +0400 Subject: [PATCH 05/20] Missed this file in previous commit --- .../MailboxPlanSelector.ascx.designer.cs | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/UserControls/MailboxPlanSelector.ascx.designer.cs diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/UserControls/MailboxPlanSelector.ascx.designer.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/UserControls/MailboxPlanSelector.ascx.designer.cs new file mode 100644 index 00000000..e1388046 --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/UserControls/MailboxPlanSelector.ascx.designer.cs @@ -0,0 +1,24 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace WebsitePanel.Portal.ExchangeServer.UserControls { + + + public partial class MailboxPlanSelector { + + /// + /// ddlMailboxPlan control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.DropDownList ddlMailboxPlan; + } +} From a240fcebc64a2839f97520e4a4ea30af7612a05c Mon Sep 17 00:00:00 2001 From: robvde Date: Tue, 10 Jul 2012 11:19:55 +0400 Subject: [PATCH 06/20] Lync Server 2010 Multitenant Core Unified Communications Support Added Enterprise voice support to follow soon --- WebsitePanel/Database/install_db.sql | 616 +++++++- WebsitePanel/Database/update_db.sql | 664 ++++++++- .../Microsoft.Rtc.Management.Core.dll | Bin 0 -> 1383232 bytes .../Microsoft.Rtc.Management.Hosted.dll | Bin 0 -> 305976 bytes ...icrosoft.Rtc.Management.WritableConfig.dll | Bin 0 -> 1231688 bytes .../Common/BusinessErrorCodes.cs | 4 + .../Packages/Quotas.cs | 14 +- .../Servers/ResourceGroups.cs | 1 + .../LyncProxy.cs | 1103 +++++++++++++++ ...ebsitePanel.EnterpriseServer.Client.csproj | 1 + .../Code/Data/DataProvider.cs | 158 +++ .../Code/HostedSolution/LyncController.cs | 821 +++++++++++ .../HostedSolution/LyncControllerAsync.cs | 97 ++ .../HostedSolution/OrganizationController.cs | 84 +- .../WebsitePanel.EnterpriseServer.csproj | 7 + .../WebsitePanel.EnterpriseServer/esLync.asmx | 1 + .../esLync.asmx.cs | 135 ++ .../HostedSolution/ILyncServer.cs | 51 + .../HostedSolution/LyncConstants.cs | 36 + .../HostedSolution/LyncErrorCodes.cs | 74 + .../HostedSolution/LyncFederationDomain.cs | 66 + .../HostedSolution/LyncUser.cs | 45 + .../HostedSolution/LyncUserPlan.cs | 112 ++ .../HostedSolution/LyncUsersPaged.cs | 50 + .../HostedSolution/LyncVoicePolicyType.cs | 39 + .../HostedSolution/OrganizationStatistics.cs | 2 + .../ResultObjects/LyncUserResult.cs | 36 + .../ResultObjects/LyncUsersPagedResult.cs | 36 + .../WebsitePanel.Providers.Base.csproj | 10 + .../Lync2010.cs | 1248 +++++++++++++++++ .../LyncTransaction.cs | 97 ++ ...bsitePanel.Providers.HostedSolution.csproj | 11 + .../LyncServerProxy.cs | 912 ++++++++++++ .../WebsitePanel.Server.Client.csproj | 1 + .../WebsitePanel.Server/LyncServer.asmx | 1 + .../WebsitePanel.Server/LyncServer.asmx.cs | 236 ++++ .../WebsitePanel.Server.csproj | 5 + .../App_Data/WebsitePanel_Modules.config | 10 +- .../WebsitePanel_SharedResources.ascx.resx | 129 ++ .../App_Themes/Default/Icons.skin | 7 + .../Default/Images/Exchange/lync16.png | Bin 0 -> 602 bytes .../App_Themes/Default/Images/lync16.png | Bin 0 -> 602 bytes .../App_Themes/Default/Images/lync48.png | Bin 0 -> 6089 bytes .../Images/lyncfederationdomains48.png | Bin 0 -> 7772 bytes .../App_Themes/Default/Images/lyncuser.png | Bin 0 -> 5193 bytes .../Default/Images/lyncuserplan48.png | Bin 0 -> 5862 bytes .../Default/Images/lyncuserplanadd48.png | Bin 0 -> 6037 bytes .../App_LocalResources/SpaceQuotas.ascx.resx | 18 + .../WebsitePanel/Code/Framework/ES.cs | 9 +- .../WebsitePanel/Code/Helpers/LyncHelper.cs | 85 ++ .../ExchangeServer/OrganizationHome.ascx.cs | 3 +- .../App_LocalResources/Menu.ascx.resx | 12 + .../ExchangeServer/UserControls/Menu.ascx.cs | 18 + .../LyncAddFederationDomain.ascx.resx | 138 ++ .../LyncAddLyncUserPlan.ascx.resx | 183 +++ .../LyncCreateUser.ascx.resx | 138 ++ .../App_LocalResources/LyncEditUser.ascx.resx | 138 ++ .../LyncFederationDomains.ascx.resx | 151 ++ .../LyncUserPlans.ascx.resx | 153 ++ .../App_LocalResources/LyncUsers.ascx.resx | 155 ++ .../Lync/LyncAddFederationDomain.ascx | 64 + .../Lync/LyncAddFederationDomain.ascx.cs | 82 ++ .../LyncAddFederationDomain.ascx.designer.cs | 177 +++ .../Lync/LyncAddLyncUserPlan.ascx | 132 ++ .../Lync/LyncAddLyncUserPlan.ascx.cs | 157 +++ .../Lync/LyncAddLyncUserPlan.ascx.designer.cs | 258 ++++ .../WebsitePanel/Lync/LyncCreateUser.ascx | 62 + .../WebsitePanel/Lync/LyncCreateUser.ascx.cs | 66 + .../Lync/LyncCreateUser.ascx.designer.cs | 132 ++ .../WebsitePanel/Lync/LyncEditUser.ascx | 54 + .../WebsitePanel/Lync/LyncEditUser.ascx.cs | 76 + .../Lync/LyncEditUser.ascx.designer.cs | 114 ++ .../Lync/LyncFederationDomains.ascx | 63 + .../Lync/LyncFederationDomains.ascx.cs | 87 ++ .../LyncFederationDomains.ascx.designer.cs | 96 ++ .../WebsitePanel/Lync/LyncUserPlans.ascx | 73 + .../WebsitePanel/Lync/LyncUserPlans.ascx.cs | 125 ++ .../Lync/LyncUserPlans.ascx.designer.cs | 105 ++ .../WebsitePanel/Lync/LyncUsers.ascx | 91 ++ .../WebsitePanel/Lync/LyncUsers.ascx.cs | 100 ++ .../Lync/LyncUsers.ascx.designer.cs | 159 +++ .../UserControls/LyncUserPlanSelector.ascx | 2 + .../UserControls/LyncUserPlanSelector.ascx.cs | 100 ++ .../LyncUserPlanSelector.ascx.designer.cs | 24 + .../Lync_Settings.ascx.resx | 144 ++ .../ProviderControls/Lync_Settings.ascx | 54 + .../ProviderControls/Lync_Settings.ascx.cs | 181 +++ .../Lync_Settings.ascx.designer.cs | 105 ++ .../WebsitePanel/SpaceQuotas.ascx | 31 +- .../WebsitePanel/SpaceQuotas.ascx.cs | 11 +- .../WebsitePanel/SpaceQuotas.ascx.designer.cs | 174 ++- .../WebsitePanel.Portal.Modules.csproj | 85 +- .../WebsitePanel.WebPortal.csproj | 6 + WebsitePanel/Sources/generate_es_proxies.bat | 4 +- 94 files changed, 11276 insertions(+), 39 deletions(-) create mode 100644 WebsitePanel/Lib/References/Microsoft/Microsoft.Rtc.Management.Core.dll create mode 100644 WebsitePanel/Lib/References/Microsoft/Microsoft.Rtc.Management.Hosted.dll create mode 100644 WebsitePanel/Lib/References/Microsoft/Microsoft.Rtc.Management.WritableConfig.dll create mode 100644 WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Client/LyncProxy.cs create mode 100644 WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/HostedSolution/LyncController.cs create mode 100644 WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/HostedSolution/LyncControllerAsync.cs create mode 100644 WebsitePanel/Sources/WebsitePanel.EnterpriseServer/esLync.asmx create mode 100644 WebsitePanel/Sources/WebsitePanel.EnterpriseServer/esLync.asmx.cs create mode 100644 WebsitePanel/Sources/WebsitePanel.Providers.Base/HostedSolution/ILyncServer.cs create mode 100644 WebsitePanel/Sources/WebsitePanel.Providers.Base/HostedSolution/LyncConstants.cs create mode 100644 WebsitePanel/Sources/WebsitePanel.Providers.Base/HostedSolution/LyncErrorCodes.cs create mode 100644 WebsitePanel/Sources/WebsitePanel.Providers.Base/HostedSolution/LyncFederationDomain.cs create mode 100644 WebsitePanel/Sources/WebsitePanel.Providers.Base/HostedSolution/LyncUser.cs create mode 100644 WebsitePanel/Sources/WebsitePanel.Providers.Base/HostedSolution/LyncUserPlan.cs create mode 100644 WebsitePanel/Sources/WebsitePanel.Providers.Base/HostedSolution/LyncUsersPaged.cs create mode 100644 WebsitePanel/Sources/WebsitePanel.Providers.Base/HostedSolution/LyncVoicePolicyType.cs create mode 100644 WebsitePanel/Sources/WebsitePanel.Providers.Base/ResultObjects/LyncUserResult.cs create mode 100644 WebsitePanel/Sources/WebsitePanel.Providers.Base/ResultObjects/LyncUsersPagedResult.cs create mode 100644 WebsitePanel/Sources/WebsitePanel.Providers.HostedSolution/Lync2010.cs create mode 100644 WebsitePanel/Sources/WebsitePanel.Providers.HostedSolution/LyncTransaction.cs create mode 100644 WebsitePanel/Sources/WebsitePanel.Server.Client/LyncServerProxy.cs create mode 100644 WebsitePanel/Sources/WebsitePanel.Server/LyncServer.asmx create mode 100644 WebsitePanel/Sources/WebsitePanel.Server/LyncServer.asmx.cs create mode 100644 WebsitePanel/Sources/WebsitePanel.WebPortal/App_Themes/Default/Images/Exchange/lync16.png create mode 100644 WebsitePanel/Sources/WebsitePanel.WebPortal/App_Themes/Default/Images/lync16.png create mode 100644 WebsitePanel/Sources/WebsitePanel.WebPortal/App_Themes/Default/Images/lync48.png create mode 100644 WebsitePanel/Sources/WebsitePanel.WebPortal/App_Themes/Default/Images/lyncfederationdomains48.png create mode 100644 WebsitePanel/Sources/WebsitePanel.WebPortal/App_Themes/Default/Images/lyncuser.png create mode 100644 WebsitePanel/Sources/WebsitePanel.WebPortal/App_Themes/Default/Images/lyncuserplan48.png create mode 100644 WebsitePanel/Sources/WebsitePanel.WebPortal/App_Themes/Default/Images/lyncuserplanadd48.png create mode 100644 WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/Code/Helpers/LyncHelper.cs create mode 100644 WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/Lync/App_LocalResources/LyncAddFederationDomain.ascx.resx create mode 100644 WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/Lync/App_LocalResources/LyncAddLyncUserPlan.ascx.resx create mode 100644 WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/Lync/App_LocalResources/LyncCreateUser.ascx.resx create mode 100644 WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/Lync/App_LocalResources/LyncEditUser.ascx.resx create mode 100644 WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/Lync/App_LocalResources/LyncFederationDomains.ascx.resx create mode 100644 WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/Lync/App_LocalResources/LyncUserPlans.ascx.resx create mode 100644 WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/Lync/App_LocalResources/LyncUsers.ascx.resx create mode 100644 WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/Lync/LyncAddFederationDomain.ascx create mode 100644 WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/Lync/LyncAddFederationDomain.ascx.cs create mode 100644 WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/Lync/LyncAddFederationDomain.ascx.designer.cs create mode 100644 WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/Lync/LyncAddLyncUserPlan.ascx create mode 100644 WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/Lync/LyncAddLyncUserPlan.ascx.cs create mode 100644 WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/Lync/LyncAddLyncUserPlan.ascx.designer.cs create mode 100644 WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/Lync/LyncCreateUser.ascx create mode 100644 WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/Lync/LyncCreateUser.ascx.cs create mode 100644 WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/Lync/LyncCreateUser.ascx.designer.cs create mode 100644 WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/Lync/LyncEditUser.ascx create mode 100644 WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/Lync/LyncEditUser.ascx.cs create mode 100644 WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/Lync/LyncEditUser.ascx.designer.cs create mode 100644 WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/Lync/LyncFederationDomains.ascx create mode 100644 WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/Lync/LyncFederationDomains.ascx.cs create mode 100644 WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/Lync/LyncFederationDomains.ascx.designer.cs create mode 100644 WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/Lync/LyncUserPlans.ascx create mode 100644 WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/Lync/LyncUserPlans.ascx.cs create mode 100644 WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/Lync/LyncUserPlans.ascx.designer.cs create mode 100644 WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/Lync/LyncUsers.ascx create mode 100644 WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/Lync/LyncUsers.ascx.cs create mode 100644 WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/Lync/LyncUsers.ascx.designer.cs create mode 100644 WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/Lync/UserControls/LyncUserPlanSelector.ascx create mode 100644 WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/Lync/UserControls/LyncUserPlanSelector.ascx.cs create mode 100644 WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/Lync/UserControls/LyncUserPlanSelector.ascx.designer.cs create mode 100644 WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ProviderControls/App_LocalResources/Lync_Settings.ascx.resx create mode 100644 WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ProviderControls/Lync_Settings.ascx create mode 100644 WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ProviderControls/Lync_Settings.ascx.cs create mode 100644 WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ProviderControls/Lync_Settings.ascx.designer.cs diff --git a/WebsitePanel/Database/install_db.sql b/WebsitePanel/Database/install_db.sql index be7e742f..e260326d 100644 --- a/WebsitePanel/Database/install_db.sql +++ b/WebsitePanel/Database/install_db.sql @@ -3641,7 +3641,7 @@ INSERT [dbo].[Quotas] ([QuotaID], [GroupID], [QuotaOrder], [QuotaName], [QuotaDe GO INSERT [dbo].[Quotas] ([QuotaID], [GroupID], [QuotaOrder], [QuotaName], [QuotaDescription], [QuotaTypeID], [ServiceQuota], [ItemTypeID]) VALUES (75, 1, 8, N'OS.ExtraApplications', N'Extra Application Packs', 1, 0, NULL) GO -INSERT [dbo].[Quotas] ([QuotaID], [GroupID], [QuotaOrder], [QuotaName], [QuotaDescription], [QuotaTypeID], [ServiceQuota], [ItemTypeID]) VALUES (77, 12, 2, N'Exchange2007.DiskSpace', N'Organization Disk Space, MB', 21, 0, NULL) +INSERT [dbo].[Quotas] ([QuotaID], [GroupID], [QuotaOrder], [QuotaName], [QuotaDescription], [QuotaTypeID], [ServiceQuota], [ItemTypeID]) VALUES (77, 12, 2, N'Exchange2007.DiskSpace', N'Organization Disk Space, MB', 2, 0, NULL) GO INSERT [dbo].[Quotas] ([QuotaID], [GroupID], [QuotaOrder], [QuotaName], [QuotaDescription], [QuotaTypeID], [ServiceQuota], [ItemTypeID]) VALUES (78, 12, 3, N'Exchange2007.Mailboxes', N'Mailboxes per Organization', 2, 0, NULL) GO @@ -3851,6 +3851,26 @@ INSERT [dbo].[Quotas] ([QuotaID], [GroupID], [QuotaOrder], [QuotaName], [QuotaDe GO INSERT [dbo].[Quotas] ([QuotaID], [GroupID], [QuotaOrder], [QuotaName], [QuotaDescription], [QuotaTypeID], [ServiceQuota], [ItemTypeID]) VALUES (368, 12, 1, N'Exchange2007.IsConsumer',N'Is Consumer Organization',1, 0 , NULL) GO +INSERT [dbo].[Quotas] ([QuotaID], [GroupID], [QuotaOrder], [QuotaName], [QuotaDescription], [QuotaTypeID], [ServiceQuota], [ItemTypeID]) VALUES (370, 41, 1, N'Lync.Users', N'Users',2 ,0 , NULL) +GO +INSERT [dbo].[Quotas] ([QuotaID], [GroupID], [QuotaOrder], [QuotaName], [QuotaDescription], [QuotaTypeID], [ServiceQuota], [ItemTypeID]) VALUES (371, 41, 2, N'Lync.Federation' , N'Allow Federation', 1, 0, NULL) +GO +INSERT [dbo].[Quotas] ([QuotaID], [GroupID], [QuotaOrder], [QuotaName], [QuotaDescription], [QuotaTypeID], [ServiceQuota], [ItemTypeID]) VALUES (372, 41, 3, N'Lync.Conferencing', N'Allow Conferencing', 1, 0, NULL) +GO +INSERT [dbo].[Quotas] ([QuotaID], [GroupID], [QuotaOrder], [QuotaName], [QuotaDescription], [QuotaTypeID], [ServiceQuota], [ItemTypeID]) VALUES (373, 41, 4, N'Lync.MaxParticipants', N'Maximum Conference Particiapants', 3, 0, NULL) +GO +INSERT [dbo].[Quotas] ([QuotaID], [GroupID], [QuotaOrder], [QuotaName], [QuotaDescription], [QuotaTypeID], [ServiceQuota], [ItemTypeID]) VALUES (374, 41, 5, N'Lync.AllowVideo', N'Allow Video in Conference', 1, 0, NULL) +GO +INSERT [dbo].[Quotas] ([QuotaID], [GroupID], [QuotaOrder], [QuotaName], [QuotaDescription], [QuotaTypeID], [ServiceQuota], [ItemTypeID]) VALUES (375, 41, 6, N'Lync.EnterpriseVoice', N'Allow EnterpriseVoice', 1, 0, NULL) +GO +INSERT [dbo].[Quotas] ([QuotaID], [GroupID], [QuotaOrder], [QuotaName], [QuotaDescription], [QuotaTypeID], [ServiceQuota], [ItemTypeID]) VALUES (376, 41, 7, N'Lync.EVUsers', N'Number of Enterprise Voice Users', 2, 0, NULL) +GO +INSERT [dbo].[Quotas] ([QuotaID], [GroupID], [QuotaOrder], [QuotaName], [QuotaDescription], [QuotaTypeID], [ServiceQuota], [ItemTypeID]) VALUES (377, 41, 8, N'Lync.EVNational', N'Allow National Calls', 1, 0, NULL) +GO +INSERT [dbo].[Quotas] ([QuotaID], [GroupID], [QuotaOrder], [QuotaName], [QuotaDescription], [QuotaTypeID], [ServiceQuota], [ItemTypeID]) VALUES (378, 41, 9, N'Lync.EVMobile', N'Allow Mobile Calls', 1, 0, NULL) +GO +INSERT [dbo].[Quotas] ([QuotaID], [GroupID], [QuotaOrder], [QuotaName], [QuotaDescription], [QuotaTypeID], [ServiceQuota], [ItemTypeID]) VALUES (379, 41, 10, N'Lync.EVInternational', N'Allow International Calls', 1, 0, NULL) +GO INSERT [dbo].[Quotas] ([QuotaID], [GroupID], [QuotaOrder], [QuotaName], [QuotaDescription], [QuotaTypeID], [ServiceQuota], [ItemTypeID]) VALUES (400, 20, 3, N'HostedSharePoint.UseSharedSSL', N'Use shared SSL Root', 1, 0, NULL) GO @@ -10631,6 +10651,8 @@ INSERT [dbo].[ResourceGroups] ([GroupID], [GroupName], [GroupOrder], [GroupContr GO INSERT [dbo].[ResourceGroups] ([GroupID], [GroupName], [GroupOrder], [GroupController]) VALUES (32, N'OCS', 22, NULL) GO +INSERT [dbo].[ResourceGroups] ([GroupID], [GroupName], [GroupOrder], [GroupController]) VALUES (41, N'Lync',23, NULL) +GO INSERT [dbo].[ResourceGroups] ([GroupID], [GroupName], [GroupOrder], [GroupController]) VALUES (40, N'VPSForPC', 20, NULL) GO SET ANSI_NULLS ON @@ -13237,6 +13259,62 @@ GO +CREATE TABLE [dbo].[LyncUserPlans]( + [LyncUserPlanId] [int] IDENTITY(1,1) NOT NULL, + [ItemID] [int] NOT NULL, + [LyncUserPlanName] [nvarchar](300) COLLATE Latin1_General_CI_AS NOT NULL, + [IM] [bit] NOT NULL, + [Mobility] [bit] NOT NULL, + [MobilityEnableOutsideVoice] [bit] NOT NULL, + [Federation] [bit] NOT NULL, + [Conferencing] [bit] NOT NULL, + [EnterpriseVoice] [bit] NOT NULL, + [VoicePolicy] [int] NOT NULL, + [IsDefault] [bit] NOT NULL, + CONSTRAINT [PK_LyncUserPlans] PRIMARY KEY CLUSTERED +( + [LyncUserPlanId] ASC +)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] +) ON [PRIMARY] + +GO + + + + + + + + + +CREATE TABLE [dbo].[LyncUsers]( + [LyncUserID] [int] IDENTITY(1,1) NOT NULL, + [AccountID] [int] NOT NULL, + [LyncUserPlanID] [int] NOT NULL, + [CreatedDate] [datetime] NOT NULL, + [ModifiedDate] [datetime] NOT NULL, + CONSTRAINT [PK_LyncUsers] PRIMARY KEY CLUSTERED +( + [LyncUserID] ASC +)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] +) ON [PRIMARY] + +GO + + + + + + + + + + + + + + + @@ -23372,6 +23450,8 @@ INSERT [dbo].[Providers] ([ProviderID], [GroupID], [ProviderName], [DisplayName] GO INSERT [dbo].[Providers] ([ProviderID], [GroupID], [ProviderName], [DisplayName], [ProviderType], [EditorControl], [DisableAutoDiscovery]) VALUES (209, 23, N'MsSQL', N'Microsoft SQL Server 2012', N'WebsitePanel.Providers.Database.MsSqlServer2012, WebsitePanel.Providers.Database.SqlServer', N'MSSQL', NULL) GO +INSERT [dbo].[Providers] ([ProviderID], [GroupID], [ProviderName], [DisplayName], [ProviderType], [EditorControl], [DisableAutoDiscovery]) VALUES (250, 41, N'Lync2010', N'Microsoft Lync Server 2010 Multitenant Hosting Pack', 'WebsitePanel.Providers.HostedSolution.Lync2010, WebsitePanel.Providers.HostedSolution', 'Lync', 1) +GO INSERT [dbo].[Providers] ([ProviderID], [GroupID], [ProviderName], [DisplayName], [ProviderType], [EditorControl], [DisableAutoDiscovery]) VALUES (300, 30, N'HyperV', N'Microsoft Hyper-V', N'WebsitePanel.Providers.Virtualization.HyperV, WebsitePanel.Providers.Virtualization.HyperV', N'HyperV', 1) GO INSERT [dbo].[Providers] ([ProviderID], [GroupID], [ProviderName], [DisplayName], [ProviderType], [EditorControl], [DisableAutoDiscovery]) VALUES (301, 11, N'MySQL', N'MySQL Server 5.5', N'WebsitePanel.Providers.Database.MySqlServer55, WebsitePanel.Providers.Database.MySQL', N'MySQL', NULL) @@ -25882,6 +25962,19 @@ AS INNER JOIN ServiceItems si ON ea.ItemID = si.ItemID INNER JOIN PackagesTreeCache pt ON si.PackageID = pt.PackageID WHERE pt.ParentPackageID = @PackageID) + ELSE IF @QuotaID = 370 -- Lync.Users + SET @Result = (SELECT COUNT(ea.AccountID) FROM ExchangeAccounts AS ea + INNER JOIN LyncUsers lu ON ea.AccountID = lu.AccountID + INNER JOIN ServiceItems si ON ea.ItemID = si.ItemID + INNER JOIN PackagesTreeCache pt ON si.PackageID = pt.PackageID + WHERE pt.ParentPackageID = @PackageID) + ELSE IF @QuotaID = 376 -- Lync.EVUsers + SET @Result = (SELECT COUNT(ea.AccountID) FROM ExchangeAccounts AS ea + INNER JOIN LyncUsers lu ON ea.AccountID = lu.AccountID + INNER JOIN LyncUserPlans lp ON lu.LyncUserPlanId = lp.LyncUserPlanId + INNER JOIN ServiceItems si ON ea.ItemID = si.ItemID + INNER JOIN PackagesTreeCache pt ON si.PackageID = pt.PackageID + WHERE pt.ParentPackageID = @PackageID AND lp.EnterpriseVoice = 1) ELSE SET @Result = (SELECT COUNT(SI.ItemID) FROM Quotas AS Q INNER JOIN ServiceItems AS SI ON SI.ItemTypeID = Q.ItemTypeID @@ -44831,6 +44924,496 @@ WHERE MailboxPlanId = @MailboxPlanId RETURN GO + + + + + + + + + + + +CREATE PROCEDURE [dbo].[AddLyncUser] + @AccountID int, + @LyncUserPlanID int +AS +BEGIN + SET NOCOUNT ON; + +INSERT INTO + dbo.LyncUsers + ( + + AccountID, + LyncUserPlanID, + CreatedDate, + ModifiedDate) +VALUES +( + @AccountID, + @LyncUserPlanID, + getdate(), + getdate() +) +END +GO + + + + + + + + +CREATE PROCEDURE [dbo].[AddLyncUserPlan] +( + @LyncUserPlanId int OUTPUT, + @ItemID int, + @LyncUserPlanName nvarchar(300), + @IM bit, + @Mobility bit, + @MobilityEnableOutsideVoice bit, + @Federation bit, + @Conferencing bit, + @EnterpriseVoice bit, + @VoicePolicy int, + @IsDefault bit +) +AS + +INSERT INTO LyncUserPlans +( + ItemID, + LyncUserPlanName, + IM, + Mobility, + MobilityEnableOutsideVoice, + Federation, + Conferencing, + EnterpriseVoice, + VoicePolicy, + IsDefault +) +VALUES +( + @ItemID, + @LyncUserPlanName, + @IM, + @Mobility, + @MobilityEnableOutsideVoice, + @Federation, + @Conferencing, + @EnterpriseVoice, + @VoicePolicy, + @IsDefault +) + +SET @LyncUserPlanId = SCOPE_IDENTITY() + +RETURN +GO + + + + + + + + + + +CREATE PROCEDURE [dbo].[CheckLyncUserExists] + @AccountID int +AS +BEGIN + SELECT + COUNT(AccountID) + FROM + dbo.LyncUsers + WHERE AccountID = @AccountID +END +GO + + + + + + + + + + +CREATE PROCEDURE [dbo].[DeleteLyncUser] +( + @AccountId int +) +AS + +DELETE FROM + LyncUsers +WHERE + AccountId = @AccountId + +RETURN +GO + + + + + + + + + + +CREATE PROCEDURE [dbo].[DeleteLyncUserPlan] +( + @LyncUserPlanId int +) +AS + +-- delete lyncuserplan +DELETE FROM LyncUserPlans +WHERE LyncUserPlanId = @LyncUserPlanId + +RETURN +GO + + + + + + + + + + + + + + + + + + + +CREATE PROCEDURE [dbo].[GetLyncUserPlan] +( + @LyncUserPlanId int +) +AS +SELECT + LyncUserPlanId, + ItemID, + LyncUserPlanName, + IM, + Mobility, + MobilityEnableOutsideVoice, + Federation, + Conferencing, + EnterpriseVoice, + VoicePolicy, + IsDefault +FROM + LyncUserPlans +WHERE + LyncUserPlanId = @LyncUserPlanId +RETURN +GO + + + + + + + + + + + + +CREATE PROCEDURE [dbo].[GetLyncUserPlanByAccountId] +( + @AccountID int +) +AS +SELECT + LyncUserPlanId, + ItemID, + LyncUserPlanName, + IM, + Mobility, + MobilityEnableOutsideVoice, + Federation, + Conferencing, + EnterpriseVoice, + VoicePolicy, + IsDefault +FROM + LyncUserPlans +WHERE + LyncUserPlanId IN (SELECT LyncUserPlanId FROM LyncUsers WHERE AccountID = @AccountID) +RETURN +GO + + + + + + + + + + + +CREATE PROCEDURE [dbo].[GetLyncUserPlans] +( + @ItemID int +) +AS +SELECT + LyncUserPlanId, + ItemID, + LyncUserPlanName, + IM, + Mobility, + MobilityEnableOutsideVoice, + Federation, + Conferencing, + EnterpriseVoice, + VoicePolicy, + IsDefault +FROM + LyncUserPlans +WHERE + ItemID = @ItemID +ORDER BY LyncUserPlanName +RETURN +GO + + + + + + + + + + + +CREATE PROCEDURE [dbo].[GetLyncUsers] +( + @ItemID int, + @SortColumn nvarchar(40), + @SortDirection nvarchar(20), + @StartRow int, + @Count int +) +AS + +CREATE TABLE #TempLyncUsers +( + [ID] [int] IDENTITY(1,1) NOT NULL, + [AccountID] [int], + [ItemID] [int] NOT NULL, + [AccountName] [nvarchar](300) NOT NULL, + [DisplayName] [nvarchar](300) NOT NULL, + [PrimaryEmailAddress] [nvarchar](300) NULL, + [SamAccountName] [nvarchar](100) NULL, + [LyncUserPlanId] [int] NOT NULL, + [LyncUserPlanName] [nvarchar] (300) NOT NULL, +) + + +DECLARE @condition nvarchar(700) +SET @condition = '' + +IF (@SortColumn = 'DisplayName') +BEGIN + SET @condition = 'ORDER BY ea.DisplayName' +END + +IF (@SortColumn = 'PrimaryEmailAddress') +BEGIN + SET @condition = 'ORDER BY ea.PrimaryEmailAddress' +END + +IF (@SortColumn = 'LyncUserPlanName') +BEGIN + SET @condition = 'ORDER BY lp.LyncUserPlanName' +END + +DECLARE @sql nvarchar(3500) + +set @sql = ' + INSERT INTO + #TempLyncUsers + SELECT + ea.AccountID, + ea.ItemID, + ea.AccountName, + ea.DisplayName, + ea.PrimaryEmailAddress, + ea.SamAccountName, + ou.LyncUserPlanId, + lp.LyncUserPlanName + FROM + ExchangeAccounts ea + INNER JOIN + LyncUsers ou + INNER JOIN + LyncUserPlans lp + ON + ou.LyncUserPlanId = lp.LyncUserPlanId + ON + ea.AccountID = ou.AccountID + WHERE + ea.ItemID = @ItemID ' + @condition + +exec sp_executesql @sql, N'@ItemID int',@ItemID + +DECLARE @RetCount int +SELECT @RetCount = COUNT(ID) FROM #TempLyncUsers + +IF (@SortDirection = 'ASC') +BEGIN + SELECT * FROM #TempLyncUsers + WHERE ID > @StartRow AND ID <= (@StartRow + @Count) +END +ELSE +BEGIN + IF @SortColumn <> '' AND @SortColumn IS NOT NULL + BEGIN + IF (@SortColumn = 'DisplayName') + BEGIN + SELECT * FROM #TempLyncUsers + WHERE ID >@RetCount - @Count - @StartRow AND ID <= @RetCount- @StartRow ORDER BY DisplayName DESC + END + IF (@SortColumn = 'PrimaryEmailAddress') + BEGIN + SELECT * FROM #TempLyncUsers + WHERE ID >@RetCount - @Count - @StartRow AND ID <= @RetCount- @StartRow ORDER BY PrimaryEmailAddress DESC + END + IF (@SortColumn = 'LyncUserPlanName') + BEGIN + SELECT * FROM #TempLyncUsers + WHERE ID >@RetCount - @Count - @StartRow AND ID <= @RetCount- @StartRow ORDER BY LyncUserPlanName DESC + END + END + ELSE + BEGIN + SELECT * FROM #TempLyncUsers + WHERE ID >@RetCount - @Count - @StartRow AND ID <= @RetCount- @StartRow ORDER BY PrimaryEmailAddress DESC + END + + +END + + +DROP TABLE #TempLyncUsers +GO + + + + + + + + + + +CREATE PROCEDURE [dbo].[GetLyncUsersCount] +( + @ItemID int +) +AS + +SELECT + COUNT(ea.AccountID) +FROM + ExchangeAccounts ea +INNER JOIN + LyncUsers ou +ON + ea.AccountID = ou.AccountID +WHERE + ea.ItemID = @ItemID +GO + + + + + + + + + +CREATE PROCEDURE [dbo].[SetLyncUserLyncUserPlan] +( + @AccountID int, + @LyncUserPlanId int +) +AS + +UPDATE LyncUsers SET + LyncUserPlanId = @LyncUserPlanId +WHERE + AccountID = @AccountID + +RETURN +GO + + + + + + + + + + + +CREATE PROCEDURE [dbo].[SetOrganizationDefaultLyncUserPlan] +( + @ItemId int, + @LyncUserPlanId int +) +AS + +UPDATE LyncUserPlans SET IsDefault=0 WHERE ItemId=@ItemId +UPDATE LyncUserPlans SET IsDefault=1 WHERE LyncUserPlanId=@LyncUserPlanId + +RETURN +GO + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -45502,5 +46085,34 @@ ON DELETE CASCADE GO ALTER TABLE [dbo].[ServiceProperties] CHECK CONSTRAINT [FK_ServiceProperties_Services] GO - + +ALTER TABLE [dbo].[LyncUsers] ADD CONSTRAINT [DF_LyncUsers_CreatedDate] DEFAULT (getdate()) FOR [CreatedDate] +GO + +ALTER TABLE [dbo].[LyncUsers] ADD CONSTRAINT [DF_LyncUsers_ChangedDate] DEFAULT (getdate()) FOR [ModifiedDate] +GO + +ALTER TABLE [dbo].[LyncUsers] WITH CHECK ADD CONSTRAINT [FK_LyncUsers_LyncUserPlans] FOREIGN KEY([LyncUserPlanId]) +REFERENCES [dbo].[LyncUserPlans] ([LyncUserPlanId]) +GO + +ALTER TABLE [dbo].[LyncUsers] CHECK CONSTRAINT [FK_LyncUsers_LyncUserPlans] +GO + +ALTER TABLE dbo.LyncUserPlans ADD CONSTRAINT + IX_LyncUserPlans UNIQUE NONCLUSTERED + ( + LyncUserPlanId + ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] + +GO +ALTER TABLE dbo.LyncUserPlans ADD CONSTRAINT + FK_LyncUserPlans_ExchangeOrganizations FOREIGN KEY + ( + ItemID + ) REFERENCES dbo.ExchangeOrganizations + ( + ItemID + ) ON UPDATE NO ACTION + ON DELETE CASCADE diff --git a/WebsitePanel/Database/update_db.sql b/WebsitePanel/Database/update_db.sql index eb5435ba..3ad8ad99 100644 --- a/WebsitePanel/Database/update_db.sql +++ b/WebsitePanel/Database/update_db.sql @@ -1,18 +1,4 @@ -USE [${install.database}] -GO - --- update database version -DECLARE @build_version nvarchar(10), @build_date datetime -SET @build_version = N'${release.version}' -SET @build_date = '${release.date}T00:00:00' -- ISO 8601 Format (YYYY-MM-DDTHH:MM:SS) - -IF NOT EXISTS (SELECT * FROM [dbo].[Versions] WHERE [DatabaseVersion] = @build_version) -BEGIN - INSERT [dbo].[Versions] ([DatabaseVersion], [BuildDate]) VALUES (@build_version, @build_date) -END -GO - -IF NOT EXISTS (SELECT * FROM [dbo].[UserSettings] WHERE ([UserID] = 1) AND ([SettingsName] = 'WebPolicy') AND ([PropertyName] = 'EnableParkingPageTokens')) +IF NOT EXISTS (SELECT * FROM [dbo].[UserSettings] WHERE ([UserID] = 1) AND ([SettingsName] = 'WebPolicy') AND ([PropertyName] = 'EnableParkingPageTokens')) BEGIN INSERT [dbo].[UserSettings] ([UserID], [SettingsName], [PropertyName], [PropertyValue]) VALUES (1, N'WebPolicy', N'EnableParkingPageTokens', N'False') END @@ -66,6 +52,14 @@ GO UPDATE [dbo].[ResourceGroups] SET [GroupOrder] = 21 WHERE [GroupName] = N'OCS' GO +IF NOT EXISTS (SELECT * FROM [dbo].[ResourceGroups] WHERE [GroupName] = 'Lync') +BEGIN +INSERT [dbo].[ResourceGroups] ([GroupID], [GroupName], [GroupOrder], [GroupController]) VALUES (41, N'Lync',22, NULL) +END +GO + + + IF NOT EXISTS (SELECT * FROM [dbo].[ServiceItemTypes] WHERE [DisplayName] = 'MsSQL2012Database') BEGIN INSERT [dbo].[ServiceItemTypes] ([ItemTypeID], [GroupID], [DisplayName], [TypeName], [TypeOrder], [CalculateDiskspace], [CalculateBandwidth], [Suspendable], [Disposable], [Searchable], [Importable], [Backupable]) VALUES (37, 23, N'MsSQL2012Database', N'WebsitePanel.Providers.Database.SqlDatabase, WebsitePanel.Providers.Base', 1, 1, 0, 0, 1, 1, 1, 1) @@ -164,6 +158,72 @@ INSERT [dbo].[Quotas] ([QuotaID], [GroupID], [QuotaOrder], [QuotaName], [QuotaDe END GO +IF NOT EXISTS (SELECT * FROM [dbo].[Quotas] WHERE [QuotaName] = 'Lync.Users') +BEGIN +INSERT [dbo].[Quotas] ([QuotaID], [GroupID], [QuotaOrder], [QuotaName], [QuotaDescription], [QuotaTypeID], [ServiceQuota], [ItemTypeID]) VALUES (370, 41, 1, N'Lync.Users', N'Users',2 ,0 , NULL) +END +GO + +IF NOT EXISTS (SELECT * FROM [dbo].[Quotas] WHERE [QuotaName] = 'Lync.Federation') +BEGIN +INSERT [dbo].[Quotas] ([QuotaID], [GroupID], [QuotaOrder], [QuotaName], [QuotaDescription], [QuotaTypeID], [ServiceQuota], [ItemTypeID]) VALUES (371, 41, 2, N'Lync.Federation' , N'Allow Federation', 1, 0, NULL) +END +GO + +IF NOT EXISTS (SELECT * FROM [dbo].[Quotas] WHERE [QuotaName] = 'Lync.Conferencing') +BEGIN +INSERT [dbo].[Quotas] ([QuotaID], [GroupID], [QuotaOrder], [QuotaName], [QuotaDescription], [QuotaTypeID], [ServiceQuota], [ItemTypeID]) VALUES (372, 41, 3, N'Lync.Conferencing', N'Allow Conferencing', 1, 0, NULL) +END +GO + +IF NOT EXISTS (SELECT * FROM [dbo].[Quotas] WHERE [QuotaName] = 'Lync.MaxParticipants') +BEGIN +INSERT [dbo].[Quotas] ([QuotaID], [GroupID], [QuotaOrder], [QuotaName], [QuotaDescription], [QuotaTypeID], [ServiceQuota], [ItemTypeID]) VALUES (373, 41, 4, N'Lync.MaxParticipants', N'Maximum Conference Particiapants', 3, 0, NULL) +END +GO + +IF NOT EXISTS (SELECT * FROM [dbo].[Quotas] WHERE [QuotaName] = 'Lync.AllowVideo') +BEGIN +INSERT [dbo].[Quotas] ([QuotaID], [GroupID], [QuotaOrder], [QuotaName], [QuotaDescription], [QuotaTypeID], [ServiceQuota], [ItemTypeID]) VALUES (374, 41, 5, N'Lync.AllowVideo', N'Allow Video in Conference', 1, 0, NULL) +END +GO + +IF NOT EXISTS (SELECT * FROM [dbo].[Quotas] WHERE [QuotaName] = 'Lync.EnterpriseVoice') +BEGIN +INSERT [dbo].[Quotas] ([QuotaID], [GroupID], [QuotaOrder], [QuotaName], [QuotaDescription], [QuotaTypeID], [ServiceQuota], [ItemTypeID]) VALUES (375, 41, 6, N'Lync.EnterpriseVoice', N'Allow EnterpriseVoice', 1, 0, NULL) +END +GO + +IF NOT EXISTS (SELECT * FROM [dbo].[Quotas] WHERE [QuotaName] = 'Lync.EVUsers') +BEGIN +INSERT [dbo].[Quotas] ([QuotaID], [GroupID], [QuotaOrder], [QuotaName], [QuotaDescription], [QuotaTypeID], [ServiceQuota], [ItemTypeID]) VALUES (376, 41, 7, N'Lync.EVUsers', N'Number of Enterprise Voice Users', 2, 0, NULL) +END +GO + +IF NOT EXISTS (SELECT * FROM [dbo].[Quotas] WHERE [QuotaName] = 'Lync.EVNational') +BEGIN +INSERT [dbo].[Quotas] ([QuotaID], [GroupID], [QuotaOrder], [QuotaName], [QuotaDescription], [QuotaTypeID], [ServiceQuota], [ItemTypeID]) VALUES (377, 41, 8, N'Lync.EVNational', N'Allow National Calls', 1, 0, NULL) +END +GO + +IF NOT EXISTS (SELECT * FROM [dbo].[Quotas] WHERE [QuotaName] = 'Lync.EVMobile') +BEGIN +INSERT [dbo].[Quotas] ([QuotaID], [GroupID], [QuotaOrder], [QuotaName], [QuotaDescription], [QuotaTypeID], [ServiceQuota], [ItemTypeID]) VALUES (378, 41, 9, N'Lync.EVMobile', N'Allow Mobile Calls', 1, 0, NULL) +END +GO + +IF NOT EXISTS (SELECT * FROM [dbo].[Quotas] WHERE [QuotaName] = 'Lync.EVInternational') +BEGIN +INSERT [dbo].[Quotas] ([QuotaID], [GroupID], [QuotaOrder], [QuotaName], [QuotaDescription], [QuotaTypeID], [ServiceQuota], [ItemTypeID]) VALUES (379, 41, 10, N'Lync.EVInternational', N'Allow International Calls', 1, 0, NULL) +END +GO + +IF NOT EXISTS (SELECT * FROM [dbo].[Quotas] WHERE [QuotaName] = 'HostedSharePoint.UseSharedSSL') +BEGIN +INSERT [dbo].[Quotas] ([QuotaID], [GroupID], [QuotaOrder], [QuotaName], [QuotaDescription], [QuotaTypeID], [ServiceQuota], [ItemTypeID]) VALUES (400, 20, 3, N'HostedSharePoint.UseSharedSSL', N'Use shared SSL Root', 1, 0, NULL) +END +GO + IF NOT EXISTS (SELECT * FROM [dbo].[Providers] WHERE [DisplayName] = 'Hosted Microsoft Exchange Server 2010 SP2') @@ -172,6 +232,16 @@ INSERT [dbo].[Providers] ([ProviderId], [GroupId], [ProviderName], [DisplayName] END GO + +IF NOT EXISTS (SELECT * FROM [dbo].[Providers] WHERE [DisplayName] = 'Microsoft Lync Server 2010 Multitenant Hosting Pack') +BEGIN +INSERT [dbo].[Providers] ([ProviderID], [GroupID], [ProviderName], [DisplayName], [ProviderType], [EditorControl], [DisableAutoDiscovery]) VALUES (250, 41, N'Lync2010', N'Microsoft Lync Server 2010 Multitenant Hosting Pack', 'WebsitePanel.Providers.HostedSolution.Lync2010, WebsitePanel.Providers.HostedSolution', 'Lync', 1) +END +GO + + + + DELETE FROM [dbo].[HostingPlanQuotas] WHERE [QuotaID] IN (SELECT [QuotaID] FROM [dbo].[Quotas] WHERE [QuotaName] = N'Exchange2007.POP3Enabled') DELETE FROM [dbo].[Quotas] WHERE [QuotaName] = N'Exchange2007.POP3Enabled' DELETE FROM [dbo].[HostingPlanQuotas] WHERE [QuotaID] IN (SELECT [QuotaID] FROM [dbo].[Quotas] WHERE [QuotaName] = N'Exchange2007.IMAPEnabled') @@ -1683,6 +1753,82 @@ ALTER TABLE [dbo].[ExchangeOrganizations] ALTER COLUMN [OrganizationID] [nvarcha GO + +-- LyncUsers +IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[LyncUsers]') AND type in (N'U')) +BEGIN +CREATE TABLE [dbo].[LyncUsers]( + [LyncUserID] [int] IDENTITY(1,1) NOT NULL, + [AccountID] [int] NOT NULL, + [LyncUserPlanID] [int] NOT NULL, + [CreatedDate] [datetime] NOT NULL, + [ModifiedDate] [datetime] NOT NULL, + CONSTRAINT [PK_LyncUsers] PRIMARY KEY CLUSTERED +( + [LyncUserID] ASC +)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] +) ON [PRIMARY] + + +ALTER TABLE [dbo].[LyncUsers] ADD CONSTRAINT [DF_LyncUsers_CreatedDate] DEFAULT (getdate()) FOR [CreatedDate] + +ALTER TABLE [dbo].[LyncUsers] ADD CONSTRAINT [DF_LyncUsers_ChangedDate] DEFAULT (getdate()) FOR [ModifiedDate] + +END +GO + + + + + +-- LyncUserPlans +IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[LyncUserPlans]') AND type in (N'U')) +BEGIN +CREATE TABLE [dbo].[LyncUserPlans]( + [LyncUserPlanId] [int] IDENTITY(1,1) NOT NULL, + [ItemID] [int] NOT NULL, + [LyncUserPlanName] [nvarchar](300) NOT NULL, + [IM] [bit] NOT NULL, + [Mobility] [bit] NOT NULL, + [MobilityEnableOutsideVoice] [bit] NOT NULL, + [Federation] [bit] NOT NULL, + [Conferencing] [bit] NOT NULL, + [EnterpriseVoice] [bit] NOT NULL, + [VoicePolicy] [int] NOT NULL, + [IsDefault] [bit] NOT NULL, + CONSTRAINT [PK_LyncUserPlans] PRIMARY KEY CLUSTERED +( + [LyncUserPlanId] ASC +)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] +) ON [PRIMARY] + +ALTER TABLE dbo.LyncUserPlans ADD CONSTRAINT + IX_LyncUserPlans UNIQUE NONCLUSTERED + ( + LyncUserPlanId + ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] + +ALTER TABLE dbo.LyncUserPlans ADD CONSTRAINT + FK_LyncUserPlans_ExchangeOrganizations FOREIGN KEY + ( + ItemID + ) REFERENCES dbo.ExchangeOrganizations + ( + ItemID + ) ON UPDATE NO ACTION + ON DELETE CASCADE + +ALTER TABLE [dbo].[LyncUsers] WITH CHECK ADD CONSTRAINT [FK_LyncUsers_LyncUserPlans] FOREIGN KEY([LyncUserPlanId]) +REFERENCES [dbo].[LyncUserPlans] ([LyncUserPlanId]) + +ALTER TABLE [dbo].[LyncUsers] CHECK CONSTRAINT [FK_LyncUsers_LyncUserPlans] + +END +GO + + + + /****** Object: Table [dbo].[AddExchangeAccount] ******/ ALTER PROCEDURE [dbo].[AddExchangeAccount] ( @@ -1955,6 +2101,19 @@ AS INNER JOIN ServiceItems si ON ea.ItemID = si.ItemID INNER JOIN PackagesTreeCache pt ON si.PackageID = pt.PackageID WHERE pt.ParentPackageID = @PackageID) + ELSE IF @QuotaID = 370 -- Lync.Users + SET @Result = (SELECT COUNT(ea.AccountID) FROM ExchangeAccounts AS ea + INNER JOIN LyncUsers lu ON ea.AccountID = lu.AccountID + INNER JOIN ServiceItems si ON ea.ItemID = si.ItemID + INNER JOIN PackagesTreeCache pt ON si.PackageID = pt.PackageID + WHERE pt.ParentPackageID = @PackageID) + ELSE IF @QuotaID = 376 -- Lync.EVUsers + SET @Result = (SELECT COUNT(ea.AccountID) FROM ExchangeAccounts AS ea + INNER JOIN LyncUsers lu ON ea.AccountID = lu.AccountID + INNER JOIN LyncUserPlans lp ON lu.LyncUserPlanId = lp.LyncUserPlanId + INNER JOIN ServiceItems si ON ea.ItemID = si.ItemID + INNER JOIN PackagesTreeCache pt ON si.PackageID = pt.PackageID + WHERE pt.ParentPackageID = @PackageID AND lp.EnterpriseVoice = 1) ELSE SET @Result = (SELECT COUNT(SI.ItemID) FROM Quotas AS Q INNER JOIN ServiceItems AS SI ON SI.ItemTypeID = Q.ItemTypeID @@ -2808,5 +2967,480 @@ exec sp_executesql @sql, N'@ItemID int, @IncludeMailboxes bit', RETURN +GO + + + + + + + + +IF NOT EXISTS (SELECT * FROM sys.objects WHERE type_desc = N'SQL_STORED_PROCEDURE' AND name = N'AddLyncUser') +BEGIN +EXEC sp_executesql N'CREATE PROCEDURE [dbo].[AddLyncUser] + @AccountID int, + @LyncUserPlanID int +AS +INSERT INTO + dbo.LyncUsers + (AccountID, + LyncUserPlanID, + CreatedDate, + ModifiedDate) +VALUES +( + @AccountID, + @LyncUserPlanID, + getdate(), + getdate() +)' +END +GO + + + + + + + + +IF NOT EXISTS (SELECT * FROM sys.objects WHERE type_desc = N'SQL_STORED_PROCEDURE' AND name = N'AddLyncUserPlan') +BEGIN +EXEC sp_executesql N'CREATE PROCEDURE [dbo].[AddLyncUserPlan] +( + @LyncUserPlanId int OUTPUT, + @ItemID int, + @LyncUserPlanName nvarchar(300), + @IM bit, + @Mobility bit, + @MobilityEnableOutsideVoice bit, + @Federation bit, + @Conferencing bit, + @EnterpriseVoice bit, + @VoicePolicy int, + @IsDefault bit +) +AS + +INSERT INTO LyncUserPlans +( + ItemID, + LyncUserPlanName, + IM, + Mobility, + MobilityEnableOutsideVoice, + Federation, + Conferencing, + EnterpriseVoice, + VoicePolicy, + IsDefault +) +VALUES +( + @ItemID, + @LyncUserPlanName, + @IM, + @Mobility, + @MobilityEnableOutsideVoice, + @Federation, + @Conferencing, + @EnterpriseVoice, + @VoicePolicy, + @IsDefault +) + +SET @LyncUserPlanId = SCOPE_IDENTITY() + +RETURN' +END +GO + + + + +IF NOT EXISTS (SELECT * FROM sys.objects WHERE type_desc = N'SQL_STORED_PROCEDURE' AND name = N'CheckLyncUserExists') +BEGIN +EXEC sp_executesql N'CREATE PROCEDURE [dbo].[CheckLyncUserExists] + @AccountID int +AS + SELECT + COUNT(AccountID) + FROM + dbo.LyncUsers + WHERE AccountID = @AccountID' +END +GO + + + +IF NOT EXISTS (SELECT * FROM sys.objects WHERE type_desc = N'SQL_STORED_PROCEDURE' AND name = N'CheckLyncUserExists') +BEGIN +EXEC sp_executesql N'CREATE PROCEDURE [dbo].[CheckLyncUserExists] + @AccountID int +AS +BEGIN + SELECT + COUNT(AccountID) + FROM + dbo.LyncUsers + WHERE AccountID = @AccountID' +END +GO + + +IF NOT EXISTS (SELECT * FROM sys.objects WHERE type_desc = N'SQL_STORED_PROCEDURE' AND name = N'DeleteLyncUser') +BEGIN +EXEC sp_executesql N'CREATE PROCEDURE [dbo].[DeleteLyncUser] +( + @AccountId int +) +AS + +DELETE FROM + LyncUsers +WHERE + AccountId = @AccountId + +RETURN' +END +GO + + + + + + + + +IF NOT EXISTS (SELECT * FROM sys.objects WHERE type_desc = N'SQL_STORED_PROCEDURE' AND name = N'DeleteLyncUserPlan') +BEGIN +EXEC sp_executesql N'CREATE PROCEDURE [dbo].[DeleteLyncUserPlan] +( + @LyncUserPlanId int +) +AS + +-- delete lyncuserplan +DELETE FROM LyncUserPlans +WHERE LyncUserPlanId = @LyncUserPlanId + +RETURN' +END +GO + + + + + + + + + +IF NOT EXISTS (SELECT * FROM sys.objects WHERE type_desc = N'SQL_STORED_PROCEDURE' AND name = N'GetLyncUserPlan') +BEGIN +EXEC sp_executesql N'CREATE PROCEDURE [dbo].[GetLyncUserPlan] +( + @LyncUserPlanId int +) +AS +SELECT + LyncUserPlanId, + ItemID, + LyncUserPlanName, + IM, + Mobility, + MobilityEnableOutsideVoice, + Federation, + Conferencing, + EnterpriseVoice, + VoicePolicy, + IsDefault +FROM + LyncUserPlans +WHERE + LyncUserPlanId = @LyncUserPlanId +RETURN' +END +GO + + + + + + + + + +IF NOT EXISTS (SELECT * FROM sys.objects WHERE type_desc = N'SQL_STORED_PROCEDURE' AND name = N'GetLyncUserPlanByAccountId') +BEGIN +EXEC sp_executesql N'CREATE PROCEDURE [dbo].[GetLyncUserPlanByAccountId] +( + @AccountID int +) +AS +SELECT + LyncUserPlanId, + ItemID, + LyncUserPlanName, + IM, + Mobility, + MobilityEnableOutsideVoice, + Federation, + Conferencing, + EnterpriseVoice, + VoicePolicy, + IsDefault +FROM + LyncUserPlans +WHERE + LyncUserPlanId IN (SELECT LyncUserPlanId FROM LyncUsers WHERE AccountID = @AccountID) +RETURN' +END +GO + + + + + + + + + + + +IF NOT EXISTS (SELECT * FROM sys.objects WHERE type_desc = N'SQL_STORED_PROCEDURE' AND name = N'GetLyncUserPlans') +BEGIN +EXEC sp_executesql N'CREATE PROCEDURE [dbo].[GetLyncUserPlans] +( + @ItemID int +) +AS +SELECT + LyncUserPlanId, + ItemID, + LyncUserPlanName, + IM, + Mobility, + MobilityEnableOutsideVoice, + Federation, + Conferencing, + EnterpriseVoice, + VoicePolicy, + IsDefault +FROM + LyncUserPlans +WHERE + ItemID = @ItemID +ORDER BY LyncUserPlanName +RETURN' +END +GO + + + + + + + + + +IF NOT EXISTS (SELECT * FROM sys.objects WHERE type_desc = N'SQL_STORED_PROCEDURE' AND name = N'GetLyncUsers') +BEGIN +EXEC sp_executesql N'CREATE PROCEDURE [dbo].[GetLyncUsers] +( + @ItemID int, + @SortColumn nvarchar(40), + @SortDirection nvarchar(20), + @StartRow int, + @Count int +) +AS + +CREATE TABLE #TempLyncUsers +( + [ID] [int] IDENTITY(1,1) NOT NULL, + [AccountID] [int], + [ItemID] [int] NOT NULL, + [AccountName] [nvarchar](300) NOT NULL, + [DisplayName] [nvarchar](300) NOT NULL, + [PrimaryEmailAddress] [nvarchar](300) NULL, + [SamAccountName] [nvarchar](100) NULL, + [LyncUserPlanId] [int] NOT NULL, + [LyncUserPlanName] [nvarchar] (300) NOT NULL, +) + + +DECLARE @condition nvarchar(700) +SET @condition = '''' + +IF (@SortColumn = ''DisplayName'') +BEGIN + SET @condition = ''ORDER BY ea.DisplayName'' +END + +IF (@SortColumn = ''PrimaryEmailAddress'') +BEGIN + SET @condition = ''ORDER BY ea.PrimaryEmailAddress'' +END + +IF (@SortColumn = ''LyncUserPlanName'') +BEGIN + SET @condition = ''ORDER BY lp.LyncUserPlanName'' +END + +DECLARE @sql nvarchar(3500) + +set @sql = '' + INSERT INTO + #TempLyncUsers + SELECT + ea.AccountID, + ea.ItemID, + ea.AccountName, + ea.DisplayName, + ea.PrimaryEmailAddress, + ea.SamAccountName, + ou.LyncUserPlanId, + lp.LyncUserPlanName + FROM + ExchangeAccounts ea + INNER JOIN + LyncUsers ou + INNER JOIN + LyncUserPlans lp + ON + ou.LyncUserPlanId = lp.LyncUserPlanId + ON + ea.AccountID = ou.AccountID + WHERE + ea.ItemID = @ItemID '' + @condition + +exec sp_executesql @sql, N''@ItemID int'',@ItemID + +DECLARE @RetCount int +SELECT @RetCount = COUNT(ID) FROM #TempLyncUsers + +IF (@SortDirection = ''ASC'') +BEGIN + SELECT * FROM #TempLyncUsers + WHERE ID > @StartRow AND ID <= (@StartRow + @Count) +END +ELSE +BEGIN + IF @SortColumn <> '''' AND @SortColumn IS NOT NULL + BEGIN + IF (@SortColumn = ''DisplayName'') + BEGIN + SELECT * FROM #TempLyncUsers + WHERE ID >@RetCount - @Count - @StartRow AND ID <= @RetCount- @StartRow ORDER BY DisplayName DESC + END + IF (@SortColumn = ''PrimaryEmailAddress'') + BEGIN + SELECT * FROM #TempLyncUsers + WHERE ID >@RetCount - @Count - @StartRow AND ID <= @RetCount- @StartRow ORDER BY PrimaryEmailAddress DESC + END + IF (@SortColumn = ''LyncUserPlanName'') + BEGIN + SELECT * FROM #TempLyncUsers + WHERE ID >@RetCount - @Count - @StartRow AND ID <= @RetCount- @StartRow ORDER BY LyncUserPlanName DESC + END + END + ELSE + BEGIN + SELECT * FROM #TempLyncUsers + WHERE ID >@RetCount - @Count - @StartRow AND ID <= @RetCount- @StartRow ORDER BY PrimaryEmailAddress DESC + END + + +END + +DROP TABLE #TempLyncUsers' +END +GO + + + + + + + + + + + + +IF NOT EXISTS (SELECT * FROM sys.objects WHERE type_desc = N'SQL_STORED_PROCEDURE' AND name = N'GetLyncUsersCount') +BEGIN +EXEC sp_executesql N'CREATE PROCEDURE [dbo].[GetLyncUsersCount] +( + @ItemID int +) +AS + +SELECT + COUNT(ea.AccountID) +FROM + ExchangeAccounts ea +INNER JOIN + LyncUsers ou +ON + ea.AccountID = ou.AccountID +WHERE + ea.ItemID = @ItemID' +END +GO + + + + + + + + +IF NOT EXISTS (SELECT * FROM sys.objects WHERE type_desc = N'SQL_STORED_PROCEDURE' AND name = N'SetLyncUserLyncUserPlan') +BEGIN +EXEC sp_executesql N'CREATE PROCEDURE [dbo].[SetLyncUserLyncUserPlan] +( + @AccountID int, + @LyncUserPlanId int +) +AS + +UPDATE LyncUsers SET + LyncUserPlanId = @LyncUserPlanId +WHERE + AccountID = @AccountID + +RETURN' +END +GO + + + + + + + + + + + + +IF NOT EXISTS (SELECT * FROM sys.objects WHERE type_desc = N'SQL_STORED_PROCEDURE' AND name = N'SetOrganizationDefaultLyncUserPlan') +BEGIN +EXEC sp_executesql N'CREATE PROCEDURE [dbo].[SetOrganizationDefaultLyncUserPlan] +( + @ItemId int, + @LyncUserPlanId int +) +AS + +UPDATE LyncUserPlans SET IsDefault=0 WHERE ItemId=@ItemId +UPDATE LyncUserPlans SET IsDefault=1 WHERE LyncUserPlanId=@LyncUserPlanId + +RETURN' +END +GO diff --git a/WebsitePanel/Lib/References/Microsoft/Microsoft.Rtc.Management.Core.dll b/WebsitePanel/Lib/References/Microsoft/Microsoft.Rtc.Management.Core.dll new file mode 100644 index 0000000000000000000000000000000000000000..beb6e4abab49e25c975d4bad8145ab9c136befad GIT binary patch literal 1383232 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

    j1TR@%TohD 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

    w}N}T~fCvUa}+qB|7a^opx(oA7bg>m36B0 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 literal 0 HcmV?d00001 diff --git a/WebsitePanel/Lib/References/Microsoft/Microsoft.Rtc.Management.Hosted.dll b/WebsitePanel/Lib/References/Microsoft/Microsoft.Rtc.Management.Hosted.dll new file mode 100644 index 0000000000000000000000000000000000000000..fb643522d9141663d93ed1a1b196e6dbb1f3a418 GIT binary patch literal 305976 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

    Isia+pu^1en1g_+hr-O7TxGfnGc&0V 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

    p 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

    y7sH5v||D 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

    V?)K(phtIjtesu!C2 zBSZ}$+x{3CxI;|_V}Fb_&ZD?J-;4}|svp5KA)n=up{j&z^JjgGZ1ZLPJJ{7TRK>h% zUr&{LgYo*X*cYlMfL%SqQ~?<4c|1^872nwXsTDF$^^T5MXCbhs{I^L zUz4$3QR)bccl)`aDnnDf8mdcVTd(nfXjONZeZ5$(iN-Ntyk3tF#HeS$Ga+B)kuj

    hKHssA#-KiFmu|9XIZDg#^o$3!V)~A`O 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 +// This code was generated by a tool. +// Runtime Version:2.0.50727.5456 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +// +// This source code was auto-generated by wsdl, Version=2.0.50727.42. +// +namespace WebsitePanel.EnterpriseServer { + using System.Xml.Serialization; + using System.Web.Services; + using System.ComponentModel; + using System.Web.Services.Protocols; + using System; + using System.Diagnostics; + + using WebsitePanel.Providers.Common; + using WebsitePanel.Providers.HostedSolution; + using WebsitePanel.Providers.ResultObjects; + + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Web.Services.WebServiceBindingAttribute(Name="esLyncSoap", Namespace="http://tempuri.org/")] + public partial class esLync : Microsoft.Web.Services3.WebServicesClientProtocol { + + private System.Threading.SendOrPostCallback CreateLyncUserOperationCompleted; + + private System.Threading.SendOrPostCallback DeleteLyncUserOperationCompleted; + + private System.Threading.SendOrPostCallback GetLyncUsersPagedOperationCompleted; + + private System.Threading.SendOrPostCallback GetLyncUserCountOperationCompleted; + + private System.Threading.SendOrPostCallback GetLyncUserPlansOperationCompleted; + + private System.Threading.SendOrPostCallback GetLyncUserPlanOperationCompleted; + + private System.Threading.SendOrPostCallback AddLyncUserPlanOperationCompleted; + + private System.Threading.SendOrPostCallback DeleteLyncUserPlanOperationCompleted; + + private System.Threading.SendOrPostCallback SetOrganizationDefaultLyncUserPlanOperationCompleted; + + private System.Threading.SendOrPostCallback GetLyncUserGeneralSettingsOperationCompleted; + + private System.Threading.SendOrPostCallback SetUserLyncPlanOperationCompleted; + + private System.Threading.SendOrPostCallback GetFederationDomainsOperationCompleted; + + private System.Threading.SendOrPostCallback AddFederationDomainOperationCompleted; + + private System.Threading.SendOrPostCallback RemoveFederationDomainOperationCompleted; + + /// + public esLync() { + this.Url = "http://localhost:9005/esLync.asmx"; + } + + /// + public event CreateLyncUserCompletedEventHandler CreateLyncUserCompleted; + + /// + public event DeleteLyncUserCompletedEventHandler DeleteLyncUserCompleted; + + /// + public event GetLyncUsersPagedCompletedEventHandler GetLyncUsersPagedCompleted; + + /// + public event GetLyncUserCountCompletedEventHandler GetLyncUserCountCompleted; + + /// + public event GetLyncUserPlansCompletedEventHandler GetLyncUserPlansCompleted; + + /// + public event GetLyncUserPlanCompletedEventHandler GetLyncUserPlanCompleted; + + /// + public event AddLyncUserPlanCompletedEventHandler AddLyncUserPlanCompleted; + + /// + public event DeleteLyncUserPlanCompletedEventHandler DeleteLyncUserPlanCompleted; + + /// + public event SetOrganizationDefaultLyncUserPlanCompletedEventHandler SetOrganizationDefaultLyncUserPlanCompleted; + + /// + public event GetLyncUserGeneralSettingsCompletedEventHandler GetLyncUserGeneralSettingsCompleted; + + /// + public event SetUserLyncPlanCompletedEventHandler SetUserLyncPlanCompleted; + + /// + public event GetFederationDomainsCompletedEventHandler GetFederationDomainsCompleted; + + /// + public event AddFederationDomainCompletedEventHandler AddFederationDomainCompleted; + + /// + public event RemoveFederationDomainCompletedEventHandler RemoveFederationDomainCompleted; + + /// + [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://tempuri.org/CreateLyncUser", RequestNamespace="http://tempuri.org/", ResponseNamespace="http://tempuri.org/", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] + public LyncUserResult CreateLyncUser(int itemId, int accountId, int lyncUserPlanId) { + object[] results = this.Invoke("CreateLyncUser", new object[] { + itemId, + accountId, + lyncUserPlanId}); + return ((LyncUserResult)(results[0])); + } + + /// + public System.IAsyncResult BeginCreateLyncUser(int itemId, int accountId, int lyncUserPlanId, System.AsyncCallback callback, object asyncState) { + return this.BeginInvoke("CreateLyncUser", new object[] { + itemId, + accountId, + lyncUserPlanId}, callback, asyncState); + } + + /// + public LyncUserResult EndCreateLyncUser(System.IAsyncResult asyncResult) { + object[] results = this.EndInvoke(asyncResult); + return ((LyncUserResult)(results[0])); + } + + /// + public void CreateLyncUserAsync(int itemId, int accountId, int lyncUserPlanId) { + this.CreateLyncUserAsync(itemId, accountId, lyncUserPlanId, null); + } + + /// + public void CreateLyncUserAsync(int itemId, int accountId, int lyncUserPlanId, object userState) { + if ((this.CreateLyncUserOperationCompleted == null)) { + this.CreateLyncUserOperationCompleted = new System.Threading.SendOrPostCallback(this.OnCreateLyncUserOperationCompleted); + } + this.InvokeAsync("CreateLyncUser", new object[] { + itemId, + accountId, + lyncUserPlanId}, this.CreateLyncUserOperationCompleted, userState); + } + + private void OnCreateLyncUserOperationCompleted(object arg) { + if ((this.CreateLyncUserCompleted != null)) { + System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); + this.CreateLyncUserCompleted(this, new CreateLyncUserCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); + } + } + + /// + [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://tempuri.org/DeleteLyncUser", RequestNamespace="http://tempuri.org/", ResponseNamespace="http://tempuri.org/", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] + public ResultObject DeleteLyncUser(int itemId, int accountId) { + object[] results = this.Invoke("DeleteLyncUser", new object[] { + itemId, + accountId}); + return ((ResultObject)(results[0])); + } + + /// + public System.IAsyncResult BeginDeleteLyncUser(int itemId, int accountId, System.AsyncCallback callback, object asyncState) { + return this.BeginInvoke("DeleteLyncUser", new object[] { + itemId, + accountId}, callback, asyncState); + } + + /// + public ResultObject EndDeleteLyncUser(System.IAsyncResult asyncResult) { + object[] results = this.EndInvoke(asyncResult); + return ((ResultObject)(results[0])); + } + + /// + public void DeleteLyncUserAsync(int itemId, int accountId) { + this.DeleteLyncUserAsync(itemId, accountId, null); + } + + /// + public void DeleteLyncUserAsync(int itemId, int accountId, object userState) { + if ((this.DeleteLyncUserOperationCompleted == null)) { + this.DeleteLyncUserOperationCompleted = new System.Threading.SendOrPostCallback(this.OnDeleteLyncUserOperationCompleted); + } + this.InvokeAsync("DeleteLyncUser", new object[] { + itemId, + accountId}, this.DeleteLyncUserOperationCompleted, userState); + } + + private void OnDeleteLyncUserOperationCompleted(object arg) { + if ((this.DeleteLyncUserCompleted != null)) { + System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); + this.DeleteLyncUserCompleted(this, new DeleteLyncUserCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); + } + } + + /// + [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://tempuri.org/GetLyncUsersPaged", RequestNamespace="http://tempuri.org/", ResponseNamespace="http://tempuri.org/", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] + public LyncUsersPagedResult GetLyncUsersPaged(int itemId, string sortColumn, string sortDirection, int startRow, int maximumRows) { + object[] results = this.Invoke("GetLyncUsersPaged", new object[] { + itemId, + sortColumn, + sortDirection, + startRow, + maximumRows}); + return ((LyncUsersPagedResult)(results[0])); + } + + /// + public System.IAsyncResult BeginGetLyncUsersPaged(int itemId, string sortColumn, string sortDirection, int startRow, int maximumRows, System.AsyncCallback callback, object asyncState) { + return this.BeginInvoke("GetLyncUsersPaged", new object[] { + itemId, + sortColumn, + sortDirection, + startRow, + maximumRows}, callback, asyncState); + } + + /// + public LyncUsersPagedResult EndGetLyncUsersPaged(System.IAsyncResult asyncResult) { + object[] results = this.EndInvoke(asyncResult); + return ((LyncUsersPagedResult)(results[0])); + } + + /// + public void GetLyncUsersPagedAsync(int itemId, string sortColumn, string sortDirection, int startRow, int maximumRows) { + this.GetLyncUsersPagedAsync(itemId, sortColumn, sortDirection, startRow, maximumRows, null); + } + + /// + public void GetLyncUsersPagedAsync(int itemId, string sortColumn, string sortDirection, int startRow, int maximumRows, object userState) { + if ((this.GetLyncUsersPagedOperationCompleted == null)) { + this.GetLyncUsersPagedOperationCompleted = new System.Threading.SendOrPostCallback(this.OnGetLyncUsersPagedOperationCompleted); + } + this.InvokeAsync("GetLyncUsersPaged", new object[] { + itemId, + sortColumn, + sortDirection, + startRow, + maximumRows}, this.GetLyncUsersPagedOperationCompleted, userState); + } + + private void OnGetLyncUsersPagedOperationCompleted(object arg) { + if ((this.GetLyncUsersPagedCompleted != null)) { + System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); + this.GetLyncUsersPagedCompleted(this, new GetLyncUsersPagedCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); + } + } + + /// + [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://tempuri.org/GetLyncUserCount", RequestNamespace="http://tempuri.org/", ResponseNamespace="http://tempuri.org/", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] + public IntResult GetLyncUserCount(int itemId) { + object[] results = this.Invoke("GetLyncUserCount", new object[] { + itemId}); + return ((IntResult)(results[0])); + } + + /// + public System.IAsyncResult BeginGetLyncUserCount(int itemId, System.AsyncCallback callback, object asyncState) { + return this.BeginInvoke("GetLyncUserCount", new object[] { + itemId}, callback, asyncState); + } + + /// + public IntResult EndGetLyncUserCount(System.IAsyncResult asyncResult) { + object[] results = this.EndInvoke(asyncResult); + return ((IntResult)(results[0])); + } + + /// + public void GetLyncUserCountAsync(int itemId) { + this.GetLyncUserCountAsync(itemId, null); + } + + /// + public void GetLyncUserCountAsync(int itemId, object userState) { + if ((this.GetLyncUserCountOperationCompleted == null)) { + this.GetLyncUserCountOperationCompleted = new System.Threading.SendOrPostCallback(this.OnGetLyncUserCountOperationCompleted); + } + this.InvokeAsync("GetLyncUserCount", new object[] { + itemId}, this.GetLyncUserCountOperationCompleted, userState); + } + + private void OnGetLyncUserCountOperationCompleted(object arg) { + if ((this.GetLyncUserCountCompleted != null)) { + System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); + this.GetLyncUserCountCompleted(this, new GetLyncUserCountCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); + } + } + + /// + [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://tempuri.org/GetLyncUserPlans", RequestNamespace="http://tempuri.org/", ResponseNamespace="http://tempuri.org/", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] + public LyncUserPlan[] GetLyncUserPlans(int itemId) { + object[] results = this.Invoke("GetLyncUserPlans", new object[] { + itemId}); + return ((LyncUserPlan[])(results[0])); + } + + /// + public System.IAsyncResult BeginGetLyncUserPlans(int itemId, System.AsyncCallback callback, object asyncState) { + return this.BeginInvoke("GetLyncUserPlans", new object[] { + itemId}, callback, asyncState); + } + + /// + public LyncUserPlan[] EndGetLyncUserPlans(System.IAsyncResult asyncResult) { + object[] results = this.EndInvoke(asyncResult); + return ((LyncUserPlan[])(results[0])); + } + + /// + public void GetLyncUserPlansAsync(int itemId) { + this.GetLyncUserPlansAsync(itemId, null); + } + + /// + public void GetLyncUserPlansAsync(int itemId, object userState) { + if ((this.GetLyncUserPlansOperationCompleted == null)) { + this.GetLyncUserPlansOperationCompleted = new System.Threading.SendOrPostCallback(this.OnGetLyncUserPlansOperationCompleted); + } + this.InvokeAsync("GetLyncUserPlans", new object[] { + itemId}, this.GetLyncUserPlansOperationCompleted, userState); + } + + private void OnGetLyncUserPlansOperationCompleted(object arg) { + if ((this.GetLyncUserPlansCompleted != null)) { + System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); + this.GetLyncUserPlansCompleted(this, new GetLyncUserPlansCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); + } + } + + /// + [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://tempuri.org/GetLyncUserPlan", RequestNamespace="http://tempuri.org/", ResponseNamespace="http://tempuri.org/", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] + public LyncUserPlan GetLyncUserPlan(int itemId, int lyncUserPlanId) { + object[] results = this.Invoke("GetLyncUserPlan", new object[] { + itemId, + lyncUserPlanId}); + return ((LyncUserPlan)(results[0])); + } + + /// + public System.IAsyncResult BeginGetLyncUserPlan(int itemId, int lyncUserPlanId, System.AsyncCallback callback, object asyncState) { + return this.BeginInvoke("GetLyncUserPlan", new object[] { + itemId, + lyncUserPlanId}, callback, asyncState); + } + + /// + public LyncUserPlan EndGetLyncUserPlan(System.IAsyncResult asyncResult) { + object[] results = this.EndInvoke(asyncResult); + return ((LyncUserPlan)(results[0])); + } + + /// + public void GetLyncUserPlanAsync(int itemId, int lyncUserPlanId) { + this.GetLyncUserPlanAsync(itemId, lyncUserPlanId, null); + } + + /// + public void GetLyncUserPlanAsync(int itemId, int lyncUserPlanId, object userState) { + if ((this.GetLyncUserPlanOperationCompleted == null)) { + this.GetLyncUserPlanOperationCompleted = new System.Threading.SendOrPostCallback(this.OnGetLyncUserPlanOperationCompleted); + } + this.InvokeAsync("GetLyncUserPlan", new object[] { + itemId, + lyncUserPlanId}, this.GetLyncUserPlanOperationCompleted, userState); + } + + private void OnGetLyncUserPlanOperationCompleted(object arg) { + if ((this.GetLyncUserPlanCompleted != null)) { + System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); + this.GetLyncUserPlanCompleted(this, new GetLyncUserPlanCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); + } + } + + /// + [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://tempuri.org/AddLyncUserPlan", RequestNamespace="http://tempuri.org/", ResponseNamespace="http://tempuri.org/", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] + public int AddLyncUserPlan(int itemId, LyncUserPlan lyncUserPlan) { + object[] results = this.Invoke("AddLyncUserPlan", new object[] { + itemId, + lyncUserPlan}); + return ((int)(results[0])); + } + + /// + public System.IAsyncResult BeginAddLyncUserPlan(int itemId, LyncUserPlan lyncUserPlan, System.AsyncCallback callback, object asyncState) { + return this.BeginInvoke("AddLyncUserPlan", new object[] { + itemId, + lyncUserPlan}, callback, asyncState); + } + + /// + public int EndAddLyncUserPlan(System.IAsyncResult asyncResult) { + object[] results = this.EndInvoke(asyncResult); + return ((int)(results[0])); + } + + /// + public void AddLyncUserPlanAsync(int itemId, LyncUserPlan lyncUserPlan) { + this.AddLyncUserPlanAsync(itemId, lyncUserPlan, null); + } + + /// + public void AddLyncUserPlanAsync(int itemId, LyncUserPlan lyncUserPlan, object userState) { + if ((this.AddLyncUserPlanOperationCompleted == null)) { + this.AddLyncUserPlanOperationCompleted = new System.Threading.SendOrPostCallback(this.OnAddLyncUserPlanOperationCompleted); + } + this.InvokeAsync("AddLyncUserPlan", new object[] { + itemId, + lyncUserPlan}, this.AddLyncUserPlanOperationCompleted, userState); + } + + private void OnAddLyncUserPlanOperationCompleted(object arg) { + if ((this.AddLyncUserPlanCompleted != null)) { + System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); + this.AddLyncUserPlanCompleted(this, new AddLyncUserPlanCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); + } + } + + /// + [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://tempuri.org/DeleteLyncUserPlan", RequestNamespace="http://tempuri.org/", ResponseNamespace="http://tempuri.org/", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] + public int DeleteLyncUserPlan(int itemId, int lyncUserPlanId) { + object[] results = this.Invoke("DeleteLyncUserPlan", new object[] { + itemId, + lyncUserPlanId}); + return ((int)(results[0])); + } + + /// + public System.IAsyncResult BeginDeleteLyncUserPlan(int itemId, int lyncUserPlanId, System.AsyncCallback callback, object asyncState) { + return this.BeginInvoke("DeleteLyncUserPlan", new object[] { + itemId, + lyncUserPlanId}, callback, asyncState); + } + + /// + public int EndDeleteLyncUserPlan(System.IAsyncResult asyncResult) { + object[] results = this.EndInvoke(asyncResult); + return ((int)(results[0])); + } + + /// + public void DeleteLyncUserPlanAsync(int itemId, int lyncUserPlanId) { + this.DeleteLyncUserPlanAsync(itemId, lyncUserPlanId, null); + } + + /// + public void DeleteLyncUserPlanAsync(int itemId, int lyncUserPlanId, object userState) { + if ((this.DeleteLyncUserPlanOperationCompleted == null)) { + this.DeleteLyncUserPlanOperationCompleted = new System.Threading.SendOrPostCallback(this.OnDeleteLyncUserPlanOperationCompleted); + } + this.InvokeAsync("DeleteLyncUserPlan", new object[] { + itemId, + lyncUserPlanId}, this.DeleteLyncUserPlanOperationCompleted, userState); + } + + private void OnDeleteLyncUserPlanOperationCompleted(object arg) { + if ((this.DeleteLyncUserPlanCompleted != null)) { + System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); + this.DeleteLyncUserPlanCompleted(this, new DeleteLyncUserPlanCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); + } + } + + /// + [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://tempuri.org/SetOrganizationDefaultLyncUserPlan", RequestNamespace="http://tempuri.org/", ResponseNamespace="http://tempuri.org/", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] + public int SetOrganizationDefaultLyncUserPlan(int itemId, int lyncUserPlanId) { + object[] results = this.Invoke("SetOrganizationDefaultLyncUserPlan", new object[] { + itemId, + lyncUserPlanId}); + return ((int)(results[0])); + } + + /// + public System.IAsyncResult BeginSetOrganizationDefaultLyncUserPlan(int itemId, int lyncUserPlanId, System.AsyncCallback callback, object asyncState) { + return this.BeginInvoke("SetOrganizationDefaultLyncUserPlan", new object[] { + itemId, + lyncUserPlanId}, callback, asyncState); + } + + /// + public int EndSetOrganizationDefaultLyncUserPlan(System.IAsyncResult asyncResult) { + object[] results = this.EndInvoke(asyncResult); + return ((int)(results[0])); + } + + /// + public void SetOrganizationDefaultLyncUserPlanAsync(int itemId, int lyncUserPlanId) { + this.SetOrganizationDefaultLyncUserPlanAsync(itemId, lyncUserPlanId, null); + } + + /// + public void SetOrganizationDefaultLyncUserPlanAsync(int itemId, int lyncUserPlanId, object userState) { + if ((this.SetOrganizationDefaultLyncUserPlanOperationCompleted == null)) { + this.SetOrganizationDefaultLyncUserPlanOperationCompleted = new System.Threading.SendOrPostCallback(this.OnSetOrganizationDefaultLyncUserPlanOperationCompleted); + } + this.InvokeAsync("SetOrganizationDefaultLyncUserPlan", new object[] { + itemId, + lyncUserPlanId}, this.SetOrganizationDefaultLyncUserPlanOperationCompleted, userState); + } + + private void OnSetOrganizationDefaultLyncUserPlanOperationCompleted(object arg) { + if ((this.SetOrganizationDefaultLyncUserPlanCompleted != null)) { + System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); + this.SetOrganizationDefaultLyncUserPlanCompleted(this, new SetOrganizationDefaultLyncUserPlanCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); + } + } + + /// + [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://tempuri.org/GetLyncUserGeneralSettings", RequestNamespace="http://tempuri.org/", ResponseNamespace="http://tempuri.org/", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] + public LyncUser GetLyncUserGeneralSettings(int itemId, int accountId) { + object[] results = this.Invoke("GetLyncUserGeneralSettings", new object[] { + itemId, + accountId}); + return ((LyncUser)(results[0])); + } + + /// + public System.IAsyncResult BeginGetLyncUserGeneralSettings(int itemId, int accountId, System.AsyncCallback callback, object asyncState) { + return this.BeginInvoke("GetLyncUserGeneralSettings", new object[] { + itemId, + accountId}, callback, asyncState); + } + + /// + public LyncUser EndGetLyncUserGeneralSettings(System.IAsyncResult asyncResult) { + object[] results = this.EndInvoke(asyncResult); + return ((LyncUser)(results[0])); + } + + /// + public void GetLyncUserGeneralSettingsAsync(int itemId, int accountId) { + this.GetLyncUserGeneralSettingsAsync(itemId, accountId, null); + } + + /// + public void GetLyncUserGeneralSettingsAsync(int itemId, int accountId, object userState) { + if ((this.GetLyncUserGeneralSettingsOperationCompleted == null)) { + this.GetLyncUserGeneralSettingsOperationCompleted = new System.Threading.SendOrPostCallback(this.OnGetLyncUserGeneralSettingsOperationCompleted); + } + this.InvokeAsync("GetLyncUserGeneralSettings", new object[] { + itemId, + accountId}, this.GetLyncUserGeneralSettingsOperationCompleted, userState); + } + + private void OnGetLyncUserGeneralSettingsOperationCompleted(object arg) { + if ((this.GetLyncUserGeneralSettingsCompleted != null)) { + System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); + this.GetLyncUserGeneralSettingsCompleted(this, new GetLyncUserGeneralSettingsCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); + } + } + + /// + [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://tempuri.org/SetUserLyncPlan", RequestNamespace="http://tempuri.org/", ResponseNamespace="http://tempuri.org/", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] + public LyncUserResult SetUserLyncPlan(int itemId, int accountId, int lyncUserPlanId) { + object[] results = this.Invoke("SetUserLyncPlan", new object[] { + itemId, + accountId, + lyncUserPlanId}); + return ((LyncUserResult)(results[0])); + } + + /// + public System.IAsyncResult BeginSetUserLyncPlan(int itemId, int accountId, int lyncUserPlanId, System.AsyncCallback callback, object asyncState) { + return this.BeginInvoke("SetUserLyncPlan", new object[] { + itemId, + accountId, + lyncUserPlanId}, callback, asyncState); + } + + /// + public LyncUserResult EndSetUserLyncPlan(System.IAsyncResult asyncResult) { + object[] results = this.EndInvoke(asyncResult); + return ((LyncUserResult)(results[0])); + } + + /// + public void SetUserLyncPlanAsync(int itemId, int accountId, int lyncUserPlanId) { + this.SetUserLyncPlanAsync(itemId, accountId, lyncUserPlanId, null); + } + + /// + public void SetUserLyncPlanAsync(int itemId, int accountId, int lyncUserPlanId, object userState) { + if ((this.SetUserLyncPlanOperationCompleted == null)) { + this.SetUserLyncPlanOperationCompleted = new System.Threading.SendOrPostCallback(this.OnSetUserLyncPlanOperationCompleted); + } + this.InvokeAsync("SetUserLyncPlan", new object[] { + itemId, + accountId, + lyncUserPlanId}, this.SetUserLyncPlanOperationCompleted, userState); + } + + private void OnSetUserLyncPlanOperationCompleted(object arg) { + if ((this.SetUserLyncPlanCompleted != null)) { + System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); + this.SetUserLyncPlanCompleted(this, new SetUserLyncPlanCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); + } + } + + /// + [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://tempuri.org/GetFederationDomains", RequestNamespace="http://tempuri.org/", ResponseNamespace="http://tempuri.org/", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] + public LyncFederationDomain[] GetFederationDomains(int itemId) { + object[] results = this.Invoke("GetFederationDomains", new object[] { + itemId}); + return ((LyncFederationDomain[])(results[0])); + } + + /// + public System.IAsyncResult BeginGetFederationDomains(int itemId, System.AsyncCallback callback, object asyncState) { + return this.BeginInvoke("GetFederationDomains", new object[] { + itemId}, callback, asyncState); + } + + /// + public LyncFederationDomain[] EndGetFederationDomains(System.IAsyncResult asyncResult) { + object[] results = this.EndInvoke(asyncResult); + return ((LyncFederationDomain[])(results[0])); + } + + /// + public void GetFederationDomainsAsync(int itemId) { + this.GetFederationDomainsAsync(itemId, null); + } + + /// + public void GetFederationDomainsAsync(int itemId, object userState) { + if ((this.GetFederationDomainsOperationCompleted == null)) { + this.GetFederationDomainsOperationCompleted = new System.Threading.SendOrPostCallback(this.OnGetFederationDomainsOperationCompleted); + } + this.InvokeAsync("GetFederationDomains", new object[] { + itemId}, this.GetFederationDomainsOperationCompleted, userState); + } + + private void OnGetFederationDomainsOperationCompleted(object arg) { + if ((this.GetFederationDomainsCompleted != null)) { + System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); + this.GetFederationDomainsCompleted(this, new GetFederationDomainsCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); + } + } + + /// + [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://tempuri.org/AddFederationDomain", RequestNamespace="http://tempuri.org/", ResponseNamespace="http://tempuri.org/", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] + public LyncUserResult AddFederationDomain(int itemId, string domainName, string proxyFqdn) { + object[] results = this.Invoke("AddFederationDomain", new object[] { + itemId, + domainName, + proxyFqdn}); + return ((LyncUserResult)(results[0])); + } + + /// + public System.IAsyncResult BeginAddFederationDomain(int itemId, string domainName, string proxyFqdn, System.AsyncCallback callback, object asyncState) { + return this.BeginInvoke("AddFederationDomain", new object[] { + itemId, + domainName, + proxyFqdn}, callback, asyncState); + } + + /// + public LyncUserResult EndAddFederationDomain(System.IAsyncResult asyncResult) { + object[] results = this.EndInvoke(asyncResult); + return ((LyncUserResult)(results[0])); + } + + /// + public void AddFederationDomainAsync(int itemId, string domainName, string proxyFqdn) { + this.AddFederationDomainAsync(itemId, domainName, proxyFqdn, null); + } + + /// + public void AddFederationDomainAsync(int itemId, string domainName, string proxyFqdn, object userState) { + if ((this.AddFederationDomainOperationCompleted == null)) { + this.AddFederationDomainOperationCompleted = new System.Threading.SendOrPostCallback(this.OnAddFederationDomainOperationCompleted); + } + this.InvokeAsync("AddFederationDomain", new object[] { + itemId, + domainName, + proxyFqdn}, this.AddFederationDomainOperationCompleted, userState); + } + + private void OnAddFederationDomainOperationCompleted(object arg) { + if ((this.AddFederationDomainCompleted != null)) { + System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); + this.AddFederationDomainCompleted(this, new AddFederationDomainCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); + } + } + + /// + [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://tempuri.org/RemoveFederationDomain", RequestNamespace="http://tempuri.org/", ResponseNamespace="http://tempuri.org/", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] + public LyncUserResult RemoveFederationDomain(int itemId, string domainName) { + object[] results = this.Invoke("RemoveFederationDomain", new object[] { + itemId, + domainName}); + return ((LyncUserResult)(results[0])); + } + + /// + public System.IAsyncResult BeginRemoveFederationDomain(int itemId, string domainName, System.AsyncCallback callback, object asyncState) { + return this.BeginInvoke("RemoveFederationDomain", new object[] { + itemId, + domainName}, callback, asyncState); + } + + /// + public LyncUserResult EndRemoveFederationDomain(System.IAsyncResult asyncResult) { + object[] results = this.EndInvoke(asyncResult); + return ((LyncUserResult)(results[0])); + } + + /// + public void RemoveFederationDomainAsync(int itemId, string domainName) { + this.RemoveFederationDomainAsync(itemId, domainName, null); + } + + /// + public void RemoveFederationDomainAsync(int itemId, string domainName, object userState) { + if ((this.RemoveFederationDomainOperationCompleted == null)) { + this.RemoveFederationDomainOperationCompleted = new System.Threading.SendOrPostCallback(this.OnRemoveFederationDomainOperationCompleted); + } + this.InvokeAsync("RemoveFederationDomain", new object[] { + itemId, + domainName}, this.RemoveFederationDomainOperationCompleted, userState); + } + + private void OnRemoveFederationDomainOperationCompleted(object arg) { + if ((this.RemoveFederationDomainCompleted != null)) { + System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); + this.RemoveFederationDomainCompleted(this, new RemoveFederationDomainCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); + } + } + + /// + public new void CancelAsync(object userState) { + base.CancelAsync(userState); + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + public delegate void CreateLyncUserCompletedEventHandler(object sender, CreateLyncUserCompletedEventArgs e); + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + public partial class CreateLyncUserCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { + + private object[] results; + + internal CreateLyncUserCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + base(exception, cancelled, userState) { + this.results = results; + } + + /// + public LyncUserResult Result { + get { + this.RaiseExceptionIfNecessary(); + return ((LyncUserResult)(this.results[0])); + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + public delegate void DeleteLyncUserCompletedEventHandler(object sender, DeleteLyncUserCompletedEventArgs e); + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + public partial class DeleteLyncUserCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { + + private object[] results; + + internal DeleteLyncUserCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + base(exception, cancelled, userState) { + this.results = results; + } + + /// + public ResultObject Result { + get { + this.RaiseExceptionIfNecessary(); + return ((ResultObject)(this.results[0])); + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + public delegate void GetLyncUsersPagedCompletedEventHandler(object sender, GetLyncUsersPagedCompletedEventArgs e); + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + public partial class GetLyncUsersPagedCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { + + private object[] results; + + internal GetLyncUsersPagedCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + base(exception, cancelled, userState) { + this.results = results; + } + + /// + public LyncUsersPagedResult Result { + get { + this.RaiseExceptionIfNecessary(); + return ((LyncUsersPagedResult)(this.results[0])); + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + public delegate void GetLyncUserCountCompletedEventHandler(object sender, GetLyncUserCountCompletedEventArgs e); + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + public partial class GetLyncUserCountCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { + + private object[] results; + + internal GetLyncUserCountCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + base(exception, cancelled, userState) { + this.results = results; + } + + /// + public IntResult Result { + get { + this.RaiseExceptionIfNecessary(); + return ((IntResult)(this.results[0])); + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + public delegate void GetLyncUserPlansCompletedEventHandler(object sender, GetLyncUserPlansCompletedEventArgs e); + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + public partial class GetLyncUserPlansCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { + + private object[] results; + + internal GetLyncUserPlansCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + base(exception, cancelled, userState) { + this.results = results; + } + + /// + public LyncUserPlan[] Result { + get { + this.RaiseExceptionIfNecessary(); + return ((LyncUserPlan[])(this.results[0])); + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + public delegate void GetLyncUserPlanCompletedEventHandler(object sender, GetLyncUserPlanCompletedEventArgs e); + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + public partial class GetLyncUserPlanCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { + + private object[] results; + + internal GetLyncUserPlanCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + base(exception, cancelled, userState) { + this.results = results; + } + + /// + public LyncUserPlan Result { + get { + this.RaiseExceptionIfNecessary(); + return ((LyncUserPlan)(this.results[0])); + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + public delegate void AddLyncUserPlanCompletedEventHandler(object sender, AddLyncUserPlanCompletedEventArgs e); + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + public partial class AddLyncUserPlanCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { + + private object[] results; + + internal AddLyncUserPlanCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + base(exception, cancelled, userState) { + this.results = results; + } + + /// + public int Result { + get { + this.RaiseExceptionIfNecessary(); + return ((int)(this.results[0])); + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + public delegate void DeleteLyncUserPlanCompletedEventHandler(object sender, DeleteLyncUserPlanCompletedEventArgs e); + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + public partial class DeleteLyncUserPlanCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { + + private object[] results; + + internal DeleteLyncUserPlanCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + base(exception, cancelled, userState) { + this.results = results; + } + + /// + public int Result { + get { + this.RaiseExceptionIfNecessary(); + return ((int)(this.results[0])); + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + public delegate void SetOrganizationDefaultLyncUserPlanCompletedEventHandler(object sender, SetOrganizationDefaultLyncUserPlanCompletedEventArgs e); + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + public partial class SetOrganizationDefaultLyncUserPlanCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { + + private object[] results; + + internal SetOrganizationDefaultLyncUserPlanCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + base(exception, cancelled, userState) { + this.results = results; + } + + /// + public int Result { + get { + this.RaiseExceptionIfNecessary(); + return ((int)(this.results[0])); + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + public delegate void GetLyncUserGeneralSettingsCompletedEventHandler(object sender, GetLyncUserGeneralSettingsCompletedEventArgs e); + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + public partial class GetLyncUserGeneralSettingsCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { + + private object[] results; + + internal GetLyncUserGeneralSettingsCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + base(exception, cancelled, userState) { + this.results = results; + } + + /// + public LyncUser Result { + get { + this.RaiseExceptionIfNecessary(); + return ((LyncUser)(this.results[0])); + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + public delegate void SetUserLyncPlanCompletedEventHandler(object sender, SetUserLyncPlanCompletedEventArgs e); + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + public partial class SetUserLyncPlanCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { + + private object[] results; + + internal SetUserLyncPlanCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + base(exception, cancelled, userState) { + this.results = results; + } + + /// + public LyncUserResult Result { + get { + this.RaiseExceptionIfNecessary(); + return ((LyncUserResult)(this.results[0])); + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + public delegate void GetFederationDomainsCompletedEventHandler(object sender, GetFederationDomainsCompletedEventArgs e); + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + public partial class GetFederationDomainsCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { + + private object[] results; + + internal GetFederationDomainsCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + base(exception, cancelled, userState) { + this.results = results; + } + + /// + public LyncFederationDomain[] Result { + get { + this.RaiseExceptionIfNecessary(); + return ((LyncFederationDomain[])(this.results[0])); + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + public delegate void AddFederationDomainCompletedEventHandler(object sender, AddFederationDomainCompletedEventArgs e); + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + public partial class AddFederationDomainCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { + + private object[] results; + + internal AddFederationDomainCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + base(exception, cancelled, userState) { + this.results = results; + } + + /// + public LyncUserResult Result { + get { + this.RaiseExceptionIfNecessary(); + return ((LyncUserResult)(this.results[0])); + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + public delegate void RemoveFederationDomainCompletedEventHandler(object sender, RemoveFederationDomainCompletedEventArgs e); + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + public partial class RemoveFederationDomainCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { + + private object[] results; + + internal RemoveFederationDomainCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + base(exception, cancelled, userState) { + this.results = results; + } + + /// + public LyncUserResult Result { + get { + this.RaiseExceptionIfNecessary(); + return ((LyncUserResult)(this.results[0])); + } + } + } +} diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Client/WebsitePanel.EnterpriseServer.Client.csproj b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Client/WebsitePanel.EnterpriseServer.Client.csproj index dfd4d020..1390dff3 100644 --- a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Client/WebsitePanel.EnterpriseServer.Client.csproj +++ b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Client/WebsitePanel.EnterpriseServer.Client.csproj @@ -87,6 +87,7 @@ code + diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/Data/DataProvider.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/Data/DataProvider.cs index 714b0165..92a6c70e 100644 --- a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/Data/DataProvider.cs +++ b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/Data/DataProvider.cs @@ -3140,5 +3140,163 @@ namespace WebsitePanel.EnterpriseServer return Convert.ToBoolean(prmId.Value); } #endregion + + #region Lync + + public static void AddLyncUser(int accountId, int lyncUserPlanId) + { + SqlHelper.ExecuteNonQuery(ConnectionString, + CommandType.StoredProcedure, + "AddLyncUser", + new[] + { + new SqlParameter("@AccountID", accountId), + new SqlParameter("@LyncUserPlanID", lyncUserPlanId) + }); + } + + public static bool CheckLyncUserExists(int accountId) + { + int res = (int)SqlHelper.ExecuteScalar(ConnectionString, CommandType.StoredProcedure, "CheckLyncUserExists", + new SqlParameter("@AccountID", accountId)); + return res > 0; + } + + public static IDataReader GetLyncUsers(int itemId, string sortColumn, string sortDirection, int startRow, int count) + { + SqlParameter[] sqlParams = new SqlParameter[] + { + new SqlParameter("@ItemID", itemId), + new SqlParameter("@SortColumn", sortColumn), + new SqlParameter("@SortDirection", sortDirection), + new SqlParameter("@StartRow", startRow), + new SqlParameter("Count", count) + }; + + + return SqlHelper.ExecuteReader( + ConnectionString, + CommandType.StoredProcedure, + "GetLyncUsers", sqlParams); + } + + public static int GetLyncUsersCount(int itemId) + { + SqlParameter[] sqlParams = new SqlParameter[] + { + new SqlParameter("@ItemID", itemId) + }; + + return + (int) + SqlHelper.ExecuteScalar(ConnectionString, CommandType.StoredProcedure, "GetLyncUsersCount", sqlParams); + } + + public static void DeleteLyncUser(int accountId) + { + SqlHelper.ExecuteNonQuery(ConnectionString, + CommandType.StoredProcedure, + "DeleteLyncUser", + new[] + { + new SqlParameter("@AccountId", accountId) + }); + + } + + public static int AddLyncUserPlan(int itemID, LyncUserPlan lyncUserPlan) + { + SqlParameter outParam = new SqlParameter("@LyncUserPlanId", SqlDbType.Int); + outParam.Direction = ParameterDirection.Output; + + SqlHelper.ExecuteNonQuery( + ConnectionString, + CommandType.StoredProcedure, + "AddLyncUserPlan", + outParam, + + new SqlParameter("@ItemID", itemID), + new SqlParameter("@LyncUserPlanName", lyncUserPlan.LyncUserPlanName), + new SqlParameter("@IM", lyncUserPlan.IM), + new SqlParameter("@Mobility", lyncUserPlan.Mobility), + new SqlParameter("@MobilityEnableOutsideVoice", lyncUserPlan.MobilityEnableOutsideVoice), + new SqlParameter("@Federation", lyncUserPlan.Federation), + new SqlParameter("@Conferencing", lyncUserPlan.Conferencing), + new SqlParameter("@EnterpriseVoice", lyncUserPlan.EnterpriseVoice), + new SqlParameter("@VoicePolicy", lyncUserPlan.VoicePolicy), + new SqlParameter("@IsDefault", lyncUserPlan.IsDefault) + ); + + return Convert.ToInt32(outParam.Value); + } + + public static void DeleteLyncUserPlan(int lyncUserPlanId) + { + SqlHelper.ExecuteNonQuery( + ConnectionString, + CommandType.StoredProcedure, + "DeleteLyncUserPlan", + new SqlParameter("@LyncUserPlanId", lyncUserPlanId) + ); + } + + public static IDataReader GetLyncUserPlan(int lyncUserPlanId) + { + return SqlHelper.ExecuteReader( + ConnectionString, + CommandType.StoredProcedure, + "GetLyncUserPlan", + new SqlParameter("@LyncUserPlanId", lyncUserPlanId) + ); + } + + + public static IDataReader GetLyncUserPlans(int itemId) + { + return SqlHelper.ExecuteReader( + ConnectionString, + CommandType.StoredProcedure, + "GetLyncUserPlans", + new SqlParameter("@ItemID", itemId) + ); + } + + + public static void SetOrganizationDefaultLyncUserPlan(int itemId, int lyncUserPlanId) + { + SqlHelper.ExecuteNonQuery( + ConnectionString, + CommandType.StoredProcedure, + "SetOrganizationDefaultLyncUserPlan", + new SqlParameter("@ItemID", itemId), + new SqlParameter("@LyncUserPlanId", lyncUserPlanId) + ); + } + + public static IDataReader GetLyncUserPlanByAccountId(int AccountId) + { + return SqlHelper.ExecuteReader( + ConnectionString, + CommandType.StoredProcedure, + "GetLyncUserPlanByAccountId", + new SqlParameter("@AccountID", AccountId) + ); + } + + + public static void SetLyncUserLyncUserplan(int accountId, int lyncUserPlanId) + { + SqlHelper.ExecuteNonQuery( + ConnectionString, + CommandType.StoredProcedure, + "SetLyncUserLyncUserplan", + new SqlParameter("@AccountID", accountId), + new SqlParameter("@LyncUserPlanId", (lyncUserPlanId == 0) ? (object)DBNull.Value : (object)lyncUserPlanId) + ); + } + + + #endregion + } } diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/HostedSolution/LyncController.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/HostedSolution/LyncController.cs new file mode 100644 index 00000000..a91d80f8 --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/HostedSolution/LyncController.cs @@ -0,0 +1,821 @@ +// Copyright (c) 2012, Outercurve Foundation. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// - Redistributions of source code must retain the above copyright notice, this +// list of conditions and the following disclaimer. +// +// - Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// - Neither the name of the Outercurve Foundation nor the names of its +// contributors may be used to endorse or promote products derived from this +// software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +using System; +using System.Collections.Generic; +using System.Collections.Specialized; +using System.Data; +using System.Xml; +using WebsitePanel.Providers; +using WebsitePanel.Providers.Common; +using WebsitePanel.Providers.HostedSolution; +using WebsitePanel.Providers.ResultObjects; +using WebsitePanel.Providers.Lync; + +namespace WebsitePanel.EnterpriseServer.Code.HostedSolution +{ + public class LyncController + { + + + public static LyncServer GetLyncServer(int lyncServiceId, int organizationServiceId) + { + LyncServer ws = new LyncServer(); + + ServiceProviderProxy.Init(ws, lyncServiceId); + + string[] lyncSettings = ws.ServiceProviderSettingsSoapHeaderValue.Settings; + + List resSettings = new List(lyncSettings); + + ExtendLyncSettings(resSettings, "primarydomaincontroller", GetProviderProperty(organizationServiceId, "primarydomaincontroller")); + ExtendLyncSettings(resSettings, "rootou", GetProviderProperty(organizationServiceId, "rootou")); + ws.ServiceProviderSettingsSoapHeaderValue.Settings = resSettings.ToArray(); + return ws; + } + + private static string GetProviderProperty(int organizationServiceId, string property) + { + + Organizations orgProxy = new Organizations(); + + ServiceProviderProxy.Init(orgProxy, organizationServiceId); + + string[] organizationSettings = orgProxy.ServiceProviderSettingsSoapHeaderValue.Settings; + + string value = string.Empty; + foreach (string str in organizationSettings) + { + string[] props = str.Split('='); + if (props[0].ToLower() == property) + { + value = str; + break; + } + } + + return value; + } + + private static void ExtendLyncSettings(List lyncSettings, string property, string value) + { + bool isAdded = false; + for (int i = 0; i < lyncSettings.Count; i++) + { + string[] props = lyncSettings[i].Split('='); + if (props[0].ToLower() == property) + { + lyncSettings[i] = value; + isAdded = true; + break; + } + } + + if (!isAdded) + { + lyncSettings.Add(value); + } + } + + private static int GetLyncServiceID(int packageId) + { + return PackageController.GetPackageServiceId(packageId, ResourceGroups.Lync); + } + + + private static bool CheckQuota(int itemId) + { + Organization org = OrganizationController.GetOrganization(itemId); + PackageContext cntx = PackageController.GetPackageContext(org.PackageId); + + IntResult userCount = GetLyncUsersCount(itemId); + + int allocatedUsers = cntx.Quotas[Quotas.LYNC_USERS].QuotaAllocatedValue; + + return allocatedUsers == -1 || allocatedUsers > userCount.Value; + } + + + public static LyncUserResult CreateLyncUser(int itemId, int accountId, int lyncUserPlanId) + { + LyncUserResult res = TaskManager.StartResultTask("LYNC", "CREATE_LYNC_USER"); + + int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo | DemandAccount.IsActive); + if (accountCheck < 0) + { + TaskManager.CompleteResultTask(res, LyncErrorCodes.NOT_AUTHORIZED); + return res; + } + + + LyncUser retLyncUser = new LyncUser(); + bool isLyncUser; + + isLyncUser = DataProvider.CheckLyncUserExists(accountId); + if (isLyncUser) + { + TaskManager.CompleteResultTask(res, LyncErrorCodes.USER_IS_ALREADY_LYNC_USER); + return res; + } + + OrganizationUser user; + user = OrganizationController.GetAccount(itemId, accountId); + if (user == null) + { + TaskManager.CompleteResultTask(res, ErrorCodes.CANNOT_GET_ACCOUNT); + return res; + } + + user = OrganizationController.GetUserGeneralSettings(itemId, accountId); + if (string.IsNullOrEmpty(user.FirstName)) + { + TaskManager.CompleteResultTask(res, LyncErrorCodes.USER_FIRST_NAME_IS_NOT_SPECIFIED); + return res; + } + + if (string.IsNullOrEmpty(user.LastName)) + { + TaskManager.CompleteResultTask(res, LyncErrorCodes.USER_LAST_NAME_IS_NOT_SPECIFIED); + return res; + } + + bool quota = CheckQuota(itemId); + if (!quota) + { + TaskManager.CompleteResultTask(res, LyncErrorCodes.USER_QUOTA_HAS_BEEN_REACHED); + return res; + } + + + LyncServer lync; + + try + { + + bool bReloadConfiguration = false; + + Organization org = (Organization)PackageController.GetPackageItem(itemId); + if (org == null) + { + throw new ApplicationException( + string.Format("Organization is null. ItemId={0}", itemId)); + } + + int lyncServiceId = GetLyncServiceID(org.PackageId); + lync = GetLyncServer(lyncServiceId, org.ServiceId); + + if (string.IsNullOrEmpty(org.LyncTenantId)) + { + PackageContext cntx = PackageController.GetPackageContext(org.PackageId); + + org.LyncTenantId = lync.CreateOrganization(org.OrganizationId, + org.DefaultDomain, + Convert.ToBoolean(cntx.Quotas[Quotas.LYNC_CONFERENCING].QuotaAllocatedValue), + Convert.ToBoolean(cntx.Quotas[Quotas.LYNC_ALLOWVIDEO].QuotaAllocatedValue), + Convert.ToInt32(cntx.Quotas[Quotas.LYNC_MAXPARTICIPANTS].QuotaAllocatedValue), + Convert.ToBoolean(cntx.Quotas[Quotas.LYNC_CONFERENCING].QuotaAllocatedValue), + Convert.ToBoolean(cntx.Quotas[Quotas.LYNC_CONFERENCING].QuotaAllocatedValue)); + + if (string.IsNullOrEmpty(org.LyncTenantId)) + { + TaskManager.CompleteResultTask(res, LyncErrorCodes.CANNOT_ENABLE_ORG); + return res; + } + else + { + PackageController.UpdatePackageItem(org); + + bReloadConfiguration = true; + } + } + + LyncUserPlan plan = GetLyncUserPlan(itemId, lyncUserPlanId); + + if (!lync.CreateUser(org.OrganizationId, user.PrimaryEmailAddress, plan)) + { + TaskManager.CompleteResultTask(res, LyncErrorCodes.CANNOT_ADD_LYNC_USER); + return res; + } + + if (bReloadConfiguration) + { + LyncControllerAsync userWorker = new LyncControllerAsync(); + userWorker.LyncServiceId = lyncServiceId; + userWorker.OrganizationServiceId = org.ServiceId; + userWorker.Enable_CsComputerAsync(); + } + } + catch (Exception ex) + { + TaskManager.CompleteResultTask(res, LyncErrorCodes.CANNOT_ADD_LYNC_USER, ex); + return res; + } + + try + { + DataProvider.AddLyncUser(accountId, lyncUserPlanId); + } + catch (Exception ex) + { + TaskManager.CompleteResultTask(res, LyncErrorCodes.CANNOT_ADD_LYNC_USER_TO_DATABASE, ex); + return res; + } + + res.IsSuccess = true; + TaskManager.CompleteResultTask(); + return res; + + } + + + private static int[] ParseMultiSetting(int lyncServiceId, string settingName) + { + List retIds = new List(); + StringDictionary settings = ServerController.GetServiceSettings(lyncServiceId); + if (!String.IsNullOrEmpty(settings[settingName])) + { + string[] ids = settings[settingName].Split(','); + + int res; + foreach (string id in ids) + { + if (int.TryParse(id, out res)) + retIds.Add(res); + } + } + + if (retIds.Count == 0) + retIds.Add(lyncServiceId); + + return retIds.ToArray(); + + } + + + public static void GetLyncServices(int lyncServiceId, out int[] lyncServiceIds) + { + lyncServiceIds = ParseMultiSetting(lyncServiceId, "LyncServersServiceID"); + } + + + + public static LyncUser GetLyncUserGeneralSettings(int itemId, int accountId) + { + TaskManager.StartTask("LYNC", "GET_LYNC_USER_GENERAL_SETTINGS"); + + LyncUser user = null; + + try + { + Organization org = (Organization)PackageController.GetPackageItem(itemId); + if (org == null) + { + throw new ApplicationException( + string.Format("Organization is null. ItemId={0}", itemId)); + } + + int lyncServiceId = GetLyncServiceID(org.PackageId); + LyncServer lync = GetLyncServer(lyncServiceId, org.ServiceId); + + OrganizationUser usr; + usr = OrganizationController.GetAccount(itemId, accountId); + + if (usr != null) + user = lync.GetLyncUserGeneralSettings(org.OrganizationId, usr.PrimaryEmailAddress); + + if (user != null) + { + LyncUserPlan plan = ObjectUtils.FillObjectFromDataReader(DataProvider.GetLyncUserPlanByAccountId(accountId)); + + if (plan != null) + { + user.LyncUserPlanId = plan.LyncUserPlanId; + user.LyncUserPlanName = plan.LyncUserPlanName; + } + } + } + catch (Exception ex) + { + throw TaskManager.WriteError(ex); + + } + TaskManager.CompleteTask(); + return user; + + } + + public static int DeleteOrganization(int itemId) + { + // check account + int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo | DemandAccount.IsActive); + if (accountCheck < 0) return accountCheck; + + // place log record + TaskManager.StartTask("LYNC", "DELETE_ORG"); + TaskManager.ItemId = itemId; + + try + { + // delete organization in Exchange + //System.Threading.Thread.Sleep(5000); + Organization org = (Organization)PackageController.GetPackageItem(itemId); + + int lyncServiceId = GetLyncServiceID(org.PackageId); + LyncServer lync = GetLyncServer(lyncServiceId, org.ServiceId); + + bool successful = lync.DeleteOrganization(org.OrganizationId, org.DefaultDomain); + + return successful ? 0 : BusinessErrorCodes.ERROR_LYNC_DELETE_SOME_PROBLEMS; + } + catch (Exception ex) + { + throw TaskManager.WriteError(ex); + } + finally + { + TaskManager.CompleteTask(); + } + } + + + public static LyncUserResult SetUserLyncPlan(int itemId, int accountId, int lyncUserPlanId) + { + LyncUserResult res = TaskManager.StartResultTask("LYNC", "SET_LYNC_USER_LYNCPLAN"); + + int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo | DemandAccount.IsActive); + if (accountCheck < 0) + { + TaskManager.CompleteResultTask(res, LyncErrorCodes.NOT_AUTHORIZED); + return res; + } + + try + { + Organization org = (Organization)PackageController.GetPackageItem(itemId); + if (org == null) + { + throw new ApplicationException( + string.Format("Organization is null. ItemId={0}", itemId)); + } + + int lyncServiceId = GetLyncServiceID(org.PackageId); + LyncServer lync = GetLyncServer(lyncServiceId, org.ServiceId); + + LyncUserPlan plan = GetLyncUserPlan(itemId, lyncUserPlanId); + + OrganizationUser user; + user = OrganizationController.GetAccount(itemId, accountId); + + if (!lync.SetLyncUserPlan(org.OrganizationId, user.PrimaryEmailAddress, plan)) + { + TaskManager.CompleteResultTask(res, LyncErrorCodes.CANNOT_ADD_LYNC_USER); + return res; + } + + try + { + DataProvider.SetLyncUserLyncUserplan(accountId, lyncUserPlanId); + } + catch (Exception ex) + { + TaskManager.CompleteResultTask(res, LyncErrorCodes.CANNOT_ADD_LYNC_USER_TO_DATABASE, ex); + return res; + } + + res.IsSuccess = true; + TaskManager.CompleteResultTask(); + return res; + } + catch (Exception ex) + { + TaskManager.CompleteResultTask(res, LyncErrorCodes.CANNOT_UPDATE_LYNC_USER, ex); + return res; + } + + } + + public static LyncUsersPagedResult GetLyncUsers(int itemId, string sortColumn, string sortDirection, int startRow, int count) + { + LyncUsersPagedResult res = TaskManager.StartResultTask("LYNC", "GET_LYNC_USERS"); + + try + { + IDataReader reader = + DataProvider.GetLyncUsers(itemId, sortColumn, sortDirection, startRow, count); + List accounts = new List(); + ObjectUtils.FillCollectionFromDataReader(accounts, reader); + res.Value = new LyncUsersPaged { PageUsers = accounts.ToArray() }; + } + catch (Exception ex) + { + TaskManager.CompleteResultTask(res, LyncErrorCodes.GET_LYNC_USERS, ex); + return res; + } + + IntResult intRes = GetLyncUsersCount(itemId); + res.ErrorCodes.AddRange(intRes.ErrorCodes); + if (!intRes.IsSuccess) + { + TaskManager.CompleteResultTask(res); + return res; + } + res.Value.RecordsCount = intRes.Value; + + TaskManager.CompleteResultTask(); + return res; + } + + public static IntResult GetLyncUsersCount(int itemId) + { + IntResult res = TaskManager.StartResultTask("LYNC", "GET_LYNC_USERS_COUNT"); + try + { + res.Value = DataProvider.GetLyncUsersCount(itemId); + } + catch (Exception ex) + { + TaskManager.CompleteResultTask(res, LyncErrorCodes.GET_LYNC_USER_COUNT, ex); + return res; + } + + TaskManager.CompleteResultTask(); + return res; + } + + public static LyncUserResult DeleteLyncUser(int itemId, int accountId) + { + LyncUserResult res = TaskManager.StartResultTask("LYNC", "DELETE_LYNC_USER"); + int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo | DemandAccount.IsActive); + + if (accountCheck < 0) + { + TaskManager.CompleteResultTask(res, LyncErrorCodes.NOT_AUTHORIZED); + return res; + } + + LyncServer lync; + + try + { + Organization org = (Organization)PackageController.GetPackageItem(itemId); + if (org == null) + { + throw new ApplicationException( + string.Format("Organization is null. ItemId={0}", itemId)); + } + + int lyncServiceId = GetLyncServiceID(org.PackageId); + lync = GetLyncServer(lyncServiceId, org.ServiceId); + + OrganizationUser user; + user = OrganizationController.GetAccount(itemId, accountId); + + if (user != null) + lync.DeleteUser(user.PrimaryEmailAddress); + } + catch (Exception ex) + { + TaskManager.CompleteResultTask(res, LyncErrorCodes.CANNOT_DELETE_LYNC_USER, ex); + return res; + } + + try + { + DataProvider.DeleteLyncUser(accountId); + } + catch (Exception ex) + { + TaskManager.CompleteResultTask(res, LyncErrorCodes.CANNOT_DELETE_LYNC_USER_FROM_METADATA, ex); + return res; + } + + TaskManager.CompleteResultTask(); + return res; + } + + + public static Organization GetOrganization(int itemId) + { + return (Organization)PackageController.GetPackageItem(itemId); + } + + + #region Lync Plans + public static List GetLyncUserPlans(int itemId) + { + // place log record + TaskManager.StartTask("LYNC", "GET_LYNC_LYNCUSERPLANS"); + TaskManager.ItemId = itemId; + + try + { + return ObjectUtils.CreateListFromDataReader( + DataProvider.GetLyncUserPlans(itemId)); + } + catch (Exception ex) + { + throw TaskManager.WriteError(ex); + } + finally + { + TaskManager.CompleteTask(); + } + } + + public static LyncUserPlan GetLyncUserPlan(int itemID, int lyncUserPlanId) + { + + // place log record + TaskManager.StartTask("LYNC", "GET_LYNC_LYNCUSERPLAN"); + TaskManager.ItemId = lyncUserPlanId; + + try + { + return ObjectUtils.FillObjectFromDataReader( + DataProvider.GetLyncUserPlan(lyncUserPlanId)); + } + catch (Exception ex) + { + throw TaskManager.WriteError(ex); + } + finally + { + TaskManager.CompleteTask(); + } + } + + public static int AddLyncUserPlan(int itemID, LyncUserPlan lyncUserPlan) + { + int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo | DemandAccount.IsActive); + if (accountCheck < 0) return accountCheck; + + // place log record + TaskManager.StartTask("LYNC", "ADD_LYNC_LYNCUSERPLAN"); + TaskManager.ItemId = itemID; + + try + { + Organization org = GetOrganization(itemID); + if (org == null) + return -1; + + // load package context + PackageContext cntx = PackageController.GetPackageContext(org.PackageId); + + lyncUserPlan.Conferencing = lyncUserPlan.Conferencing & Convert.ToBoolean(cntx.Quotas[Quotas.LYNC_CONFERENCING].QuotaAllocatedValue); + lyncUserPlan.EnterpriseVoice = lyncUserPlan.EnterpriseVoice & Convert.ToBoolean(cntx.Quotas[Quotas.LYNC_ENTERPRISEVOICE].QuotaAllocatedValue); + if (!lyncUserPlan.EnterpriseVoice) + lyncUserPlan.VoicePolicy = LyncVoicePolicyType.None; + lyncUserPlan.IM = true; + + return DataProvider.AddLyncUserPlan(itemID, lyncUserPlan); + } + catch (Exception ex) + { + throw TaskManager.WriteError(ex); + } + finally + { + TaskManager.CompleteTask(); + } + + } + + public static int DeleteLyncUserPlan(int itemID, int lyncUserPlanId) + { + int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo | DemandAccount.IsActive); + if (accountCheck < 0) return accountCheck; + + TaskManager.StartTask("LYNC", "DELETE_LYNC_LYNCPLAN"); + TaskManager.ItemId = itemID; + + try + { + DataProvider.DeleteLyncUserPlan(lyncUserPlanId); + + return 0; + } + catch (Exception ex) + { + throw TaskManager.WriteError(ex); + } + finally + { + TaskManager.CompleteTask(); + } + + } + + public static int SetOrganizationDefaultLyncUserPlan(int itemId, int lyncUserPlanId) + { + int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo | DemandAccount.IsActive); + if (accountCheck < 0) return accountCheck; + + TaskManager.StartTask("LYNC", "SET_LYNC_LYNCUSERPLAN"); + TaskManager.ItemId = itemId; + + try + { + DataProvider.SetOrganizationDefaultLyncUserPlan(itemId, lyncUserPlanId); + + } + catch (Exception ex) + { + throw TaskManager.WriteError(ex); + } + finally + { + TaskManager.CompleteTask(); + } + + return 1; + + } + + #endregion + + #region Federation Domains + public static LyncFederationDomain[] GetFederationDomains(int itemId) + { + // place log record + TaskManager.StartTask("LYNC", "GET_LYNC_FEDERATIONDOMAINS"); + TaskManager.ItemId = itemId; + + LyncFederationDomain[] lyncFederationDomains = null; + + try + { + Organization org = (Organization)PackageController.GetPackageItem(itemId); + + int lyncServiceId = GetLyncServiceID(org.PackageId); + LyncServer lync = GetLyncServer(lyncServiceId, org.ServiceId); + + lyncFederationDomains = lync.GetFederationDomains(org.OrganizationId); + } + catch (Exception ex) + { + throw TaskManager.WriteError(ex); + } + finally + { + TaskManager.CompleteTask(); + } + + return lyncFederationDomains; + } + + public static LyncUserResult AddFederationDomain(int itemId, string domainName, string proxyFqdn) + { + LyncUserResult res = TaskManager.StartResultTask("LYNC", "ADD_LYNC_FEDERATIONDOMAIN"); + TaskManager.ItemId = itemId; + TaskManager.TaskParameters["domainName"] = domainName; + TaskManager.TaskParameters["proxyFqdn"] = proxyFqdn; + + int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo | DemandAccount.IsActive); + + if (accountCheck < 0) + { + TaskManager.CompleteResultTask(res, LyncErrorCodes.NOT_AUTHORIZED); + return res; + } + + + try + { + + Organization org = (Organization)PackageController.GetPackageItem(itemId); + if (org == null) + { + throw new ApplicationException( + string.Format("Organization is null. ItemId={0}", itemId)); + } + + int lyncServiceId = GetLyncServiceID(org.PackageId); + LyncServer lync = GetLyncServer(lyncServiceId, org.ServiceId); + + if (string.IsNullOrEmpty(org.LyncTenantId)) + { + PackageContext cntx = PackageController.GetPackageContext(org.PackageId); + + org.LyncTenantId = lync.CreateOrganization(org.OrganizationId, + org.DefaultDomain, + Convert.ToBoolean(cntx.Quotas[Quotas.LYNC_CONFERENCING].QuotaAllocatedValue), + Convert.ToBoolean(cntx.Quotas[Quotas.LYNC_ALLOWVIDEO].QuotaAllocatedValue), + Convert.ToInt32(cntx.Quotas[Quotas.LYNC_MAXPARTICIPANTS].QuotaAllocatedValue), + Convert.ToBoolean(cntx.Quotas[Quotas.LYNC_CONFERENCING].QuotaAllocatedValue), + Convert.ToBoolean(cntx.Quotas[Quotas.LYNC_CONFERENCING].QuotaAllocatedValue)); + + if (string.IsNullOrEmpty(org.LyncTenantId)) + { + TaskManager.CompleteResultTask(res, LyncErrorCodes.CANNOT_ENABLE_ORG); + return res; + } + else + PackageController.UpdatePackageItem(org); + } + + lync = GetLyncServer(lyncServiceId, org.ServiceId); + + lync.AddFederationDomain(org.OrganizationId, domainName, proxyFqdn); + } + catch (Exception ex) + { + TaskManager.CompleteResultTask(res, LyncErrorCodes.CANNOT_ADD_LYNC_FEDERATIONDOMAIN, ex); + return res; + } + + TaskManager.CompleteResultTask(); + return res; + } + + public static LyncUserResult RemoveFederationDomain(int itemId, string domainName) + { + LyncUserResult res = TaskManager.StartResultTask("LYNC", "REMOVE_LYNC_FEDERATIONDOMAIN"); + TaskManager.ItemId = itemId; + TaskManager.TaskParameters["domainName"] = domainName; + + int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo | DemandAccount.IsActive); + + if (accountCheck < 0) + { + TaskManager.CompleteResultTask(res, LyncErrorCodes.NOT_AUTHORIZED); + return res; + } + + try + { + Organization org = (Organization)PackageController.GetPackageItem(itemId); + if (org == null) + { + throw new ApplicationException( + string.Format("Organization is null. ItemId={0}", itemId)); + } + + int lyncServiceId = GetLyncServiceID(org.PackageId); + LyncServer lync = GetLyncServer(lyncServiceId, org.ServiceId); + + if (org.OrganizationId.ToLower() == domainName.ToLower()) + { + TaskManager.CompleteResultTask(res, LyncErrorCodes.CANNOT_REMOVE_LYNC_FEDERATIONDOMAIN); + return res; + } + + lync.RemoveFederationDomain(org.OrganizationId, domainName); + } + catch (Exception ex) + { + TaskManager.CompleteResultTask(res, LyncErrorCodes.CANNOT_REMOVE_LYNC_FEDERATIONDOMAIN, ex); + return res; + } + + TaskManager.CompleteResultTask(); + return res; + } + + + #endregion + + + #region Private methods + public static UInt64 ConvertPhoneNumberToLong(string ip) + { + return Convert.ToUInt64(ip); + } + + public static string ConvertLongToPhoneNumber(UInt64 ip) + { + if (ip == 0) + return ""; + + return ip.ToString(); + } + #endregion + + + } +} diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/HostedSolution/LyncControllerAsync.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/HostedSolution/LyncControllerAsync.cs new file mode 100644 index 00000000..f30dc4f6 --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/HostedSolution/LyncControllerAsync.cs @@ -0,0 +1,97 @@ +// Copyright (c) 2012, Outercurve Foundation. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// - Redistributions of source code must retain the above copyright notice, this +// list of conditions and the following disclaimer. +// +// - Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// - Neither the name of the Outercurve Foundation nor the names of its +// contributors may be used to endorse or promote products derived from this +// software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +using System; +using System.Threading; +using System.Collections.Generic; +using System.Text; +using WebsitePanel.Providers; +using WebsitePanel.Providers.Common; +using WebsitePanel.Providers.HostedSolution; +using WebsitePanel.Providers.ResultObjects; +using WebsitePanel.Providers.Lync; +using WebsitePanel.EnterpriseServer.Code.HostedSolution; + + +namespace WebsitePanel.EnterpriseServer.Code.HostedSolution +{ + public class LyncControllerAsync + { + private int lyncServiceId; + private int organizationServiceId; + + public int LyncServiceId + { + get { return this.lyncServiceId; } + set { this.lyncServiceId = value; } + } + + public int OrganizationServiceId + { + get { return this.organizationServiceId; } + set { this.organizationServiceId = value; } + } + + + public void Enable_CsComputerAsync() + { + // start asynchronously + Thread t = new Thread(new ThreadStart(Enable_CsComputer)); + t.Start(); + } + + private void Enable_CsComputer() + { + int[] lyncServiceIds; + + LyncController.GetLyncServices(lyncServiceId, out lyncServiceIds); + + foreach (int id in lyncServiceIds) + { + LyncServer lync = null; + try + { + lync = LyncController.GetLyncServer(id, organizationServiceId); + if (lync != null) + { + lync.ReloadConfiguration(); + } + } + catch (Exception exe) + { + TaskManager.WriteError(exe); + continue; + } + } + + + } + + + } +} \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/HostedSolution/OrganizationController.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/HostedSolution/OrganizationController.cs index 07672218..b3856eba 100644 --- a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/HostedSolution/OrganizationController.cs +++ b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/HostedSolution/OrganizationController.cs @@ -482,6 +482,66 @@ namespace WebsitePanel.EnterpriseServer } } + + private static bool DeleteLyncUsers(int itemId) + { + bool successful = false; + + try + { + LyncUsersPagedResult res = LyncController.GetLyncUsers(itemId, string.Empty, string.Empty, 0, int.MaxValue); + + if (res.IsSuccess) + { + successful = true; + foreach (LyncUser user in res.Value.PageUsers) + { + try + { + ResultObject delUserResult = LyncController.DeleteLyncUser(itemId, user.AccountID); + if (!delUserResult.IsSuccess) + { + StringBuilder sb = new StringBuilder(); + foreach (string str in delUserResult.ErrorCodes) + { + sb.Append(str); + sb.Append('\n'); + } + + throw new ApplicationException(sb.ToString()); + } + } + catch (Exception ex) + { + successful = false; + TaskManager.WriteError(ex); + } + } + + return successful; + } + else + { + StringBuilder sb = new StringBuilder(); + foreach (string str in res.ErrorCodes) + { + sb.Append(str); + sb.Append('\n'); + } + + throw new ApplicationException(sb.ToString()); + } + } + catch (Exception ex) + { + successful = false; + TaskManager.WriteError(ex); + } + + return successful; + } + + public static int DeleteOrganization(int itemId) { // check account @@ -570,7 +630,22 @@ namespace WebsitePanel.EnterpriseServer successful = false; TaskManager.WriteError(ex); } - + + //Cleanup Lync + try + { + if (!string.IsNullOrEmpty(org.LyncTenantId)) + if (DeleteLyncUsers(itemId)) + LyncController.DeleteOrganization(itemId); + } + catch (Exception ex) + { + successful = false; + TaskManager.WriteError(ex); + } + + + //Cleanup Exchange try { if (!string.IsNullOrEmpty(org.GlobalAddressList)) @@ -791,6 +866,11 @@ namespace WebsitePanel.EnterpriseServer stats.AllocatedOCSUsers = cntx.Quotas[Quotas.OCS_USERS].QuotaAllocatedValue; } + if (cntx.Groups.ContainsKey(ResourceGroups.Lync)) + { + stats.CreatedLyncUsers = LyncController.GetLyncUsersCount(org.Id).Value; + stats.AllocatedLyncUsers = cntx.Quotas[Quotas.LYNC_USERS].QuotaAllocatedValue; + } return stats; } @@ -1371,7 +1451,7 @@ namespace WebsitePanel.EnterpriseServer retUser.AccountType = account.AccountType; retUser.CrmUserId = CRMController.GetCrmUserId(accountId); retUser.IsOCSUser = DataProvider.CheckOCSUserExists(accountId); - //retUser.IsLyncUser = DataProvider.CheckLyncUserExists(accountId); + retUser.IsLyncUser = DataProvider.CheckLyncUserExists(accountId); retUser.IsBlackBerryUser = BlackBerryController.CheckBlackBerryUserExists(accountId); retUser.SubscriberNumber = account.SubscriberNumber; diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/WebsitePanel.EnterpriseServer.csproj b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/WebsitePanel.EnterpriseServer.csproj index a2556f80..cb74773e 100644 --- a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/WebsitePanel.EnterpriseServer.csproj +++ b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/WebsitePanel.EnterpriseServer.csproj @@ -78,6 +78,7 @@ + @@ -130,6 +131,8 @@ + + @@ -235,6 +238,10 @@ + + esLync.asmx + Component + esVirtualizationServerForPrivateCloud.asmx Component diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/esLync.asmx b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/esLync.asmx new file mode 100644 index 00000000..a481f74b --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/esLync.asmx @@ -0,0 +1 @@ +<%@ WebService Language="C#" CodeBehind="esLync.asmx.cs" Class="WebsitePanel.EnterpriseServer.esLync" %> diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/esLync.asmx.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/esLync.asmx.cs new file mode 100644 index 00000000..56ba913b --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/esLync.asmx.cs @@ -0,0 +1,135 @@ +// Copyright (c) 2012, Outercurve Foundation. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// - Redistributions of source code must retain the above copyright notice, this +// list of conditions and the following disclaimer. +// +// - Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// - Neither the name of the Outercurve Foundation nor the names of its +// contributors may be used to endorse or promote products derived from this +// software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +using System.Web.Services; +using WebsitePanel.EnterpriseServer.Code.HostedSolution; +using WebsitePanel.Providers.Common; +using WebsitePanel.Providers.HostedSolution; +using WebsitePanel.Providers.ResultObjects; +using System.Collections.Generic; + +namespace WebsitePanel.EnterpriseServer +{ + ///

    + /// Summary description for esLync + /// + [WebService(Namespace = "http://tempuri.org/")] + [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] + [System.ComponentModel.ToolboxItem(false)] + public class esLync : WebService + { + + [WebMethod] + public LyncUserResult CreateLyncUser(int itemId, int accountId, int lyncUserPlanId) + { + return LyncController.CreateLyncUser(itemId, accountId, lyncUserPlanId); + } + + [WebMethod] + public ResultObject DeleteLyncUser(int itemId, int accountId) + { + return LyncController.DeleteLyncUser(itemId, accountId); + } + + [WebMethod] + public LyncUsersPagedResult GetLyncUsersPaged(int itemId, string sortColumn, string sortDirection, int startRow, int maximumRows) + { + return LyncController.GetLyncUsers(itemId, sortColumn, sortDirection, startRow, maximumRows); + } + + [WebMethod] + public IntResult GetLyncUserCount(int itemId) + { + return LyncController.GetLyncUsersCount(itemId); + } + + + #region Lync User Plans + [WebMethod] + public List GetLyncUserPlans(int itemId) + { + return LyncController.GetLyncUserPlans(itemId); + } + + [WebMethod] + public LyncUserPlan GetLyncUserPlan(int itemId, int lyncUserPlanId) + { + return LyncController.GetLyncUserPlan(itemId, lyncUserPlanId); + } + + [WebMethod] + public int AddLyncUserPlan(int itemId, LyncUserPlan lyncUserPlan) + { + return LyncController.AddLyncUserPlan(itemId, lyncUserPlan); + } + + [WebMethod] + public int DeleteLyncUserPlan(int itemId, int lyncUserPlanId) + { + return LyncController.DeleteLyncUserPlan(itemId, lyncUserPlanId); + } + + [WebMethod] + public int SetOrganizationDefaultLyncUserPlan(int itemId, int lyncUserPlanId) + { + return LyncController.SetOrganizationDefaultLyncUserPlan(itemId, lyncUserPlanId); + } + + [WebMethod] + public LyncUser GetLyncUserGeneralSettings(int itemId, int accountId) + { + return LyncController.GetLyncUserGeneralSettings(itemId, accountId); + } + + [WebMethod] + public LyncUserResult SetUserLyncPlan(int itemId, int accountId, int lyncUserPlanId) + { + return LyncController.SetUserLyncPlan(itemId, accountId, lyncUserPlanId); + } + + [WebMethod] + public LyncFederationDomain[] GetFederationDomains(int itemId) + { + return LyncController.GetFederationDomains(itemId); + } + + [WebMethod] + public LyncUserResult AddFederationDomain(int itemId, string domainName, string proxyFqdn) + { + return LyncController.AddFederationDomain(itemId, domainName, proxyFqdn); + } + + [WebMethod] + public LyncUserResult RemoveFederationDomain(int itemId, string domainName) + { + return LyncController.RemoveFederationDomain(itemId, domainName); + } + + #endregion + } +} \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.Providers.Base/HostedSolution/ILyncServer.cs b/WebsitePanel/Sources/WebsitePanel.Providers.Base/HostedSolution/ILyncServer.cs new file mode 100644 index 00000000..ef1047a0 --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.Providers.Base/HostedSolution/ILyncServer.cs @@ -0,0 +1,51 @@ +// Copyright (c) 2012, Outercurve Foundation. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// - Redistributions of source code must retain the above copyright notice, this +// list of conditions and the following disclaimer. +// +// - Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// - Neither the name of the Outercurve Foundation nor the names of its +// contributors may be used to endorse or promote products derived from this +// software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +using System; +using System.Collections.Generic; +using System.Text; + +namespace WebsitePanel.Providers.HostedSolution +{ + public interface ILyncServer + { + string CreateOrganization(string organizationId, string sipDomain, bool enableConferencing, bool enableConferencingVideo, int maxConferenceSize, bool enabledFederation, bool enabledEnterpriseVoice); + bool DeleteOrganization(string organizationId, string sipDomain); + + bool CreateUser(string organizationId, string userUpn, LyncUserPlan plan); + LyncUser GetLyncUserGeneralSettings(string organizationId, string userUpn); + bool SetLyncUserPlan(string organizationId, string userUpn, LyncUserPlan plan); + bool DeleteUser(string userUpn); + + LyncFederationDomain[] GetFederationDomains(string organizationId); + bool AddFederationDomain(string organizationId, string domainName, string proxyFqdn); + bool RemoveFederationDomain(string organizationId, string domainName); + + void ReloadConfiguration(); + } +} diff --git a/WebsitePanel/Sources/WebsitePanel.Providers.Base/HostedSolution/LyncConstants.cs b/WebsitePanel/Sources/WebsitePanel.Providers.Base/HostedSolution/LyncConstants.cs new file mode 100644 index 00000000..4da82007 --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.Providers.Base/HostedSolution/LyncConstants.cs @@ -0,0 +1,36 @@ +// Copyright (c) 2012, Outercurve Foundation. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// - Redistributions of source code must retain the above copyright notice, this +// list of conditions and the following disclaimer. +// +// - Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// - Neither the name of the Outercurve Foundation nor the names of its +// contributors may be used to endorse or promote products derived from this +// software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +namespace WebsitePanel.Providers.HostedSolution + { + public class LyncConstants + { + public const string PoolFQDN = "PoolFQDN"; + public const string SimpleUrlRoot = "SimpleUrlRoot"; + } + } diff --git a/WebsitePanel/Sources/WebsitePanel.Providers.Base/HostedSolution/LyncErrorCodes.cs b/WebsitePanel/Sources/WebsitePanel.Providers.Base/HostedSolution/LyncErrorCodes.cs new file mode 100644 index 00000000..15cfbae8 --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.Providers.Base/HostedSolution/LyncErrorCodes.cs @@ -0,0 +1,74 @@ +// Copyright (c) 2012, Outercurve Foundation. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// - Redistributions of source code must retain the above copyright notice, this +// list of conditions and the following disclaimer. +// +// - Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// - Neither the name of the Outercurve Foundation nor the names of its +// contributors may be used to endorse or promote products derived from this +// software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +namespace WebsitePanel.Providers.HostedSolution + { + public class LyncErrorCodes + { + public const string CANNOT_CHECK_IF_LYNC_USER_EXISTS = "CANNOT_CHECK_IF_LYNC_USER_EXISTS"; + + public const string USER_IS_ALREADY_LYNC_USER = "USER_IS_ALREADY_LYNC_USER"; + + public const string USER_FIRST_NAME_IS_NOT_SPECIFIED = "USER_FIRST_NAME_IS_NOT_SPECIFIED"; + + public const string USER_LAST_NAME_IS_NOT_SPECIFIED = "USER_LAST_NAME_IS_NOT_SPECIFIED"; + + public const string CANNOT_GET_USER_GENERAL_SETTINGS = "CANNOT_GET_USER_GENERAL_SETTINGS"; + + public const string CANNOT_ADD_LYNC_USER_TO_DATABASE = "CANNOT_ADD_LYNC_USER_TO_DATABASE"; + + public const string GET_LYNC_USER_COUNT = "GET_LYNC_USER_COUNT"; + + public const string GET_LYNC_USERS = "GET_LYNC_USERS"; + + public const string CANNOT_DELETE_LYNC_USER_FROM_METADATA = "CANNOT_DELETE_LYNC_USER_FROM_METADATA"; + + public const string CANNOT_DELETE_LYNC_USER = "CANNOT_DELETE_LYNC_USER"; + + public const string CANNOT_GET_LYNC_PROXY = "CANNOT_GET_LYNC_PROXY"; + + public const string USER_QUOTA_HAS_BEEN_REACHED = "USER_QUOTA_HAS_BEEN_REACHED"; + + public const string CANNOT_CHECK_QUOTA = "CANNOT_CHECK_QUOTA"; + + public const string CANNOT_SET_DEFAULT_SETTINGS = "CANNOT_SET_DEFAULT_SETTINGS"; + + public const string CANNOT_ADD_LYNC_USER = "CANNOT_ADD_LYNC_USER"; + + public const string CANNOT_UPDATE_LYNC_USER = "CANNOT_UPDATE_LYNC_USER"; + + public const string CANNOT_ENABLE_ORG = "CANNOT_ENABLE_ORG"; + + public const string NOT_AUTHORIZED = "NOT_AUTHORIZED"; + + public const string CANNOT_ADD_LYNC_FEDERATIONDOMAIN = "CANNOT_ADD_LYNC_FEDERATIONDOMAIN"; + + public const string CANNOT_REMOVE_LYNC_FEDERATIONDOMAIN = "CANNOT_REMOVE_LYNC_FEDERATIONDOMAIN"; + + } + } diff --git a/WebsitePanel/Sources/WebsitePanel.Providers.Base/HostedSolution/LyncFederationDomain.cs b/WebsitePanel/Sources/WebsitePanel.Providers.Base/HostedSolution/LyncFederationDomain.cs new file mode 100644 index 00000000..f5ac4498 --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.Providers.Base/HostedSolution/LyncFederationDomain.cs @@ -0,0 +1,66 @@ +// Copyright (c) 2012, Outercurve Foundation. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// - Redistributions of source code must retain the above copyright notice, this +// list of conditions and the following disclaimer. +// +// - Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// - Neither the name of the Outercurve Foundation nor the names of its +// contributors may be used to endorse or promote products derived from this +// software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +using System; +using System.Collections.Generic; +using System.Text; + +namespace WebsitePanel.Providers.HostedSolution +{ + public class LyncFederationDomain + { + string domainName; + string comment; + bool markForMonitoring; + string proxyFqdn; + + public string DomainName + { + get { return this.domainName; } + set { this.domainName = value; } + } + + public string Comment + { + get { return this.comment; } + set { this.comment = value; } + } + + public bool MarkForMonitoring + { + get { return this.markForMonitoring; } + set { this.markForMonitoring = value; } + } + + public string ProxyFqdn + { + get { return this.proxyFqdn; } + set { this.proxyFqdn = value; } + } + } +} diff --git a/WebsitePanel/Sources/WebsitePanel.Providers.Base/HostedSolution/LyncUser.cs b/WebsitePanel/Sources/WebsitePanel.Providers.Base/HostedSolution/LyncUser.cs new file mode 100644 index 00000000..1a4dd851 --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.Providers.Base/HostedSolution/LyncUser.cs @@ -0,0 +1,45 @@ +// Copyright (c) 2012, Outercurve Foundation. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// - Redistributions of source code must retain the above copyright notice, this +// list of conditions and the following disclaimer. +// +// - Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// - Neither the name of the Outercurve Foundation nor the names of its +// contributors may be used to endorse or promote products derived from this +// software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +using System; +using System.Collections.Generic; +using System.Text; + +namespace WebsitePanel.Providers.HostedSolution +{ + public class LyncUser + { + public string PrimaryUri { get; set; } + public string PrimaryEmailAddress { get; set; } + public string DisplayName { get; set; } + public string LineUri { get; set; } + public int AccountID { get; set; } + public int LyncUserPlanId { get; set; } + public string LyncUserPlanName { get; set; } + } +} diff --git a/WebsitePanel/Sources/WebsitePanel.Providers.Base/HostedSolution/LyncUserPlan.cs b/WebsitePanel/Sources/WebsitePanel.Providers.Base/HostedSolution/LyncUserPlan.cs new file mode 100644 index 00000000..27b236ec --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.Providers.Base/HostedSolution/LyncUserPlan.cs @@ -0,0 +1,112 @@ +// Copyright (c) 2012, Outercurve Foundation. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// - Redistributions of source code must retain the above copyright notice, this +// list of conditions and the following disclaimer. +// +// - Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// - Neither the name of the Outercurve Foundation nor the names of its +// contributors may be used to endorse or promote products derived from this +// software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +using System; +using System.Collections.Generic; +using System.Text; + +namespace WebsitePanel.Providers.HostedSolution +{ + public class LyncUserPlan + { + int lyncUserPlanId; + string lyncUserPlanName; + + bool im; + bool federation; + bool conferencing; + bool enterpriseVoice; + bool mobility; + bool mobilityEnableOutsideVoice; + LyncVoicePolicyType voicePolicy; + + bool isDefault; + + public int LyncUserPlanId + { + get { return this.lyncUserPlanId; } + set { this.lyncUserPlanId = value; } + } + + public string LyncUserPlanName + { + get { return this.lyncUserPlanName; } + set { this.lyncUserPlanName = value; } + } + + public bool IM + { + get { return this.im; } + set { this.im = value; } + } + + public bool IsDefault + { + get { return this.isDefault; } + set { this.isDefault = value; } + } + + public bool Federation + { + get { return this.federation; } + set { this.federation = value; } + } + + public bool Conferencing + { + get { return this.conferencing; } + set { this.conferencing = value; } + } + + public bool EnterpriseVoice + { + get { return this.enterpriseVoice; } + set { this.enterpriseVoice = value; } + } + + public bool Mobility + { + get { return this.mobility; } + set { this.mobility = value; } + } + + public bool MobilityEnableOutsideVoice + { + get { return this.mobilityEnableOutsideVoice; } + set { this.mobilityEnableOutsideVoice = value; } + } + + public LyncVoicePolicyType VoicePolicy + { + get { return this.voicePolicy; } + set { this.voicePolicy = value; } + } + + + } +} diff --git a/WebsitePanel/Sources/WebsitePanel.Providers.Base/HostedSolution/LyncUsersPaged.cs b/WebsitePanel/Sources/WebsitePanel.Providers.Base/HostedSolution/LyncUsersPaged.cs new file mode 100644 index 00000000..6df0867c --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.Providers.Base/HostedSolution/LyncUsersPaged.cs @@ -0,0 +1,50 @@ +// Copyright (c) 2012, Outercurve Foundation. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// - Redistributions of source code must retain the above copyright notice, this +// list of conditions and the following disclaimer. +// +// - Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// - Neither the name of the Outercurve Foundation nor the names of its +// contributors may be used to endorse or promote products derived from this +// software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + + +namespace WebsitePanel.Providers.HostedSolution +{ + public class LyncUsersPaged + { + int recordsCount; + LyncUser[] pageUsers; + + public int RecordsCount + { + get { return recordsCount; } + set { recordsCount = value; } + } + + public LyncUser[] PageUsers + { + get { return pageUsers; } + set { pageUsers = value; } + } + } +} diff --git a/WebsitePanel/Sources/WebsitePanel.Providers.Base/HostedSolution/LyncVoicePolicyType.cs b/WebsitePanel/Sources/WebsitePanel.Providers.Base/HostedSolution/LyncVoicePolicyType.cs new file mode 100644 index 00000000..fc203a67 --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.Providers.Base/HostedSolution/LyncVoicePolicyType.cs @@ -0,0 +1,39 @@ +// Copyright (c) 2012, Outercurve Foundation. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// - Redistributions of source code must retain the above copyright notice, this +// list of conditions and the following disclaimer. +// +// - Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// - Neither the name of the Outercurve Foundation nor the names of its +// contributors may be used to endorse or promote products derived from this +// software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +namespace WebsitePanel.Providers.HostedSolution +{ + public enum LyncVoicePolicyType + { + None = 0, + Emergency = 1, + National = 2, + Mobile = 3, + International = 4 + } +} diff --git a/WebsitePanel/Sources/WebsitePanel.Providers.Base/HostedSolution/OrganizationStatistics.cs b/WebsitePanel/Sources/WebsitePanel.Providers.Base/HostedSolution/OrganizationStatistics.cs index bc322dd4..50981d9e 100644 --- a/WebsitePanel/Sources/WebsitePanel.Providers.Base/HostedSolution/OrganizationStatistics.cs +++ b/WebsitePanel/Sources/WebsitePanel.Providers.Base/HostedSolution/OrganizationStatistics.cs @@ -173,6 +173,8 @@ namespace WebsitePanel.Providers.HostedSolution public int CreatedOCSUsers { get; set; } public int AllocatedOCSUsers { get; set; } + public int CreatedLyncUsers { get; set; } + public int AllocatedLyncUsers { get; set; } } } diff --git a/WebsitePanel/Sources/WebsitePanel.Providers.Base/ResultObjects/LyncUserResult.cs b/WebsitePanel/Sources/WebsitePanel.Providers.Base/ResultObjects/LyncUserResult.cs new file mode 100644 index 00000000..bf5e64fd --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.Providers.Base/ResultObjects/LyncUserResult.cs @@ -0,0 +1,36 @@ +// Copyright (c) 2012, Outercurve Foundation. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// - Redistributions of source code must retain the above copyright notice, this +// list of conditions and the following disclaimer. +// +// - Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// - Neither the name of the Outercurve Foundation nor the names of its +// contributors may be used to endorse or promote products derived from this +// software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +using WebsitePanel.Providers.HostedSolution; + +namespace WebsitePanel.Providers.ResultObjects +{ + public class LyncUserResult : ValueResultObject + { + } +} diff --git a/WebsitePanel/Sources/WebsitePanel.Providers.Base/ResultObjects/LyncUsersPagedResult.cs b/WebsitePanel/Sources/WebsitePanel.Providers.Base/ResultObjects/LyncUsersPagedResult.cs new file mode 100644 index 00000000..169b13cd --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.Providers.Base/ResultObjects/LyncUsersPagedResult.cs @@ -0,0 +1,36 @@ +// Copyright (c) 2012, Outercurve Foundation. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// - Redistributions of source code must retain the above copyright notice, this +// list of conditions and the following disclaimer. +// +// - Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// - Neither the name of the Outercurve Foundation nor the names of its +// contributors may be used to endorse or promote products derived from this +// software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +using WebsitePanel.Providers.HostedSolution; + +namespace WebsitePanel.Providers.ResultObjects +{ + public class LyncUsersPagedResult : ValueResultObject + { + } +} diff --git a/WebsitePanel/Sources/WebsitePanel.Providers.Base/WebsitePanel.Providers.Base.csproj b/WebsitePanel/Sources/WebsitePanel.Providers.Base/WebsitePanel.Providers.Base.csproj index a74bff15..d5f41672 100644 --- a/WebsitePanel/Sources/WebsitePanel.Providers.Base/WebsitePanel.Providers.Base.csproj +++ b/WebsitePanel/Sources/WebsitePanel.Providers.Base/WebsitePanel.Providers.Base.csproj @@ -80,6 +80,14 @@ + + + + + + + + @@ -118,6 +126,8 @@ + + diff --git a/WebsitePanel/Sources/WebsitePanel.Providers.HostedSolution/Lync2010.cs b/WebsitePanel/Sources/WebsitePanel.Providers.HostedSolution/Lync2010.cs new file mode 100644 index 00000000..21887292 --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.Providers.HostedSolution/Lync2010.cs @@ -0,0 +1,1248 @@ +// Copyright (c) 2012, Outercurve Foundation. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// - Redistributions of source code must retain the above copyright notice, this +// list of conditions and the following disclaimer. +// +// - Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// - Neither the name of the Outercurve Foundation nor the names of its +// contributors may be used to endorse or promote products derived from this +// software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +using System; +using System.IO; +using System.Collections; +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.Text; +using System.Reflection; +using System.Globalization; +using System.DirectoryServices; + +using Microsoft.Win32; + +using WebsitePanel.Providers; +using WebsitePanel.Providers.HostedSolution; +using WebsitePanel.Providers.Utils; +using WebsitePanel.Server.Utils; + +using System.Management; +using System.Management.Automation; +using System.Management.Automation.Runspaces; + +using Microsoft.Rtc.Management.Hosted; +using Microsoft.Rtc.Management.WritableConfig.Settings.Edge; +using Microsoft.Rtc.Management.WritableConfig.Settings.SimpleUrl; + + +namespace WebsitePanel.Providers.HostedSolution +{ + public class Lync2010 : HostingServiceProviderBase, ILyncServer + { + + #region Static constructor + static Lync2010() + { + LyncRegistryPath = "SOFTWARE\\Microsoft\\Real-Time Communications"; + } + + internal static string LyncRegistryPath + { + get; + set; + } + + #endregion + + + #region Properties + + /// + /// Pool FQDN + /// + private string PoolFQDN + { + get { return ProviderSettings[LyncConstants.PoolFQDN]; } + } + + private string SimpleUrlRoot + { + get { return ProviderSettings[LyncConstants.SimpleUrlRoot]; } + } + + internal string PrimaryDomainController + { + get { return ProviderSettings["PrimaryDomainController"]; } + } + + private string RootOU + { + get { return ProviderSettings["RootOU"]; } + } + + private string RootDomain + { + get { return ServerSettings.ADRootDomain; } + } + + + #endregion + + #region ILyncServer implementation + + public string CreateOrganization(string organizationId, string sipDomain, bool enableConferencing, bool enableConferencingVideo, int maxConferenceSize, bool enabledFederation, bool enabledEnterpriseVoice) + { + return CreateOrganizationInternal(organizationId, sipDomain, enableConferencing, enableConferencingVideo, maxConferenceSize, enabledFederation, enabledEnterpriseVoice); + } + + public bool DeleteOrganization(string organizationId, string sipDomain) + { + return DeleteOrganizationInternal(organizationId, sipDomain); + } + + public bool CreateUser(string organizationId, string userUpn, LyncUserPlan plan) + { + return CreateUserInternal(organizationId, userUpn, plan); + } + + public LyncUser GetLyncUserGeneralSettings(string organizationId, string userUpn) + { + return GetLyncUserGeneralSettingsInternal(organizationId, userUpn); + } + + public bool SetLyncUserPlan(string organizationId, string userUpn, LyncUserPlan plan) + { + return SetLyncUserPlanInternal(organizationId, userUpn, plan, null); + } + + public bool DeleteUser(string userUpn) + { + return DeleteUserInternal(userUpn); + } + + public LyncFederationDomain[] GetFederationDomains(string organizationId) + { + return GetFederationDomainsInternal(organizationId); + } + + public bool AddFederationDomain(string organizationId, string domainName, string proxyFqdn) + { + return AddFederationDomainInternal(organizationId, domainName, proxyFqdn); + } + + public bool RemoveFederationDomain(string organizationId, string domainName) + { + return RemoveFederationDomainInternal(organizationId, domainName); + } + + public void ReloadConfiguration() + { + ReloadConfigurationInternal(); + } + + #endregion + + #region organization + private string CreateOrganizationInternal(string organizationId, string sipDomain, bool enableConferencing, bool enableConferencingVideo, int maxConferenceSize, bool enabledFederation, bool enabledEnterpriseVoice) + { + HostedSolutionLog.LogStart("CreateOrganizationInternal"); + HostedSolutionLog.DebugInfo("organizationId: {0}", organizationId); + HostedSolutionLog.DebugInfo("sipDomain: {0}", sipDomain); + + string TenantId = string.Empty; + + LyncTransaction transaction = StartTransaction(); + + Runspace runSpace = null; + try + { + runSpace = OpenRunspace(); + + // create sip domain + Command cmd = new Command("New-CsSipDomain"); + cmd.Parameters.Add("Identity", sipDomain); + ExecuteShellCommand(runSpace, cmd, false); + + transaction.RegisterNewSipDomain(sipDomain); + + //set the msRTCSIP-Domains, TenantID, ObjectID + Guid id = Guid.NewGuid(); + + string path = AddADPrefix(GetOrganizationPath(organizationId)); + DirectoryEntry ou = ActiveDirectoryUtils.GetADObject(path); + ActiveDirectoryUtils.SetADObjectPropertyValue(ou, "msRTCSIP-Domains", sipDomain); + ActiveDirectoryUtils.SetADObjectPropertyValue(ou, "msRTCSIP-TenantId", id); + ActiveDirectoryUtils.SetADObjectPropertyValue(ou, "msRTCSIP-ObjectId", id); + ou.CommitChanges(); + + //Create simpleurls + CreateSimpleUrl(runSpace, sipDomain, id); + transaction.RegisterNewSimpleUrl(sipDomain, id.ToString()); + + //create conferencing policy + cmd = new Command("New-CsConferencingPolicy"); + cmd.Parameters.Add("Identity", organizationId); + cmd.Parameters.Add("MaxMeetingSize", maxConferenceSize); + cmd.Parameters.Add("AllowIPVideo", enableConferencingVideo); + ExecuteShellCommand(runSpace, cmd, false); + transaction.RegisterNewConferencingPolicy(organizationId); + + //create external access policy + cmd = new Command("New-CsExternalAccessPolicy"); + cmd.Parameters.Add("Identity", organizationId); + cmd.Parameters.Add("EnableFederationAccess", true); + cmd.Parameters.Add("EnableOutsideAccess", true); + cmd.Parameters.Add("EnablePublicCloudAccess", false); + cmd.Parameters.Add("EnablePublicCloudAudioVideoAccess", false); + ExecuteShellCommand(runSpace, cmd, false); + transaction.RegisterNewCsExternalAccessPolicy(organizationId); + + //Enable for federation + AllowList allowList = new AllowList(); + DomainPattern domain = new DomainPattern(sipDomain); + allowList.AllowedDomain.Add(domain); + + cmd = new Command("Set-CsTenantFederationConfiguration"); + cmd.Parameters.Add("Tenant", id); + cmd.Parameters.Add("AllowFederatedUsers", true); + cmd.Parameters.Add("AllowedDomains", allowList); + ExecuteShellCommand(runSpace, cmd, false); + + //create mobility policy + cmd = new Command("New-CsMobilityPolicy"); + cmd.Parameters.Add("Identity", organizationId + " EnableOutSideVoice"); + cmd.Parameters.Add("EnableMobility", true); + cmd.Parameters.Add("EnableOutsideVoice", true); + ExecuteShellCommand(runSpace, cmd, false); + transaction.RegisterNewCsMobilityPolicy(organizationId + " EnableOutSideVoice"); + + cmd = new Command("New-CsMobilityPolicy"); + cmd.Parameters.Add("Identity", organizationId + " DisableOutSideVoice"); + cmd.Parameters.Add("EnableMobility", true); + cmd.Parameters.Add("EnableOutsideVoice", false); + ExecuteShellCommand(runSpace, cmd, false); + transaction.RegisterNewCsMobilityPolicy(organizationId + " DisableOutSideVoice"); + + cmd = new Command("Invoke-CsManagementStoreReplication"); + ExecuteShellCommand(runSpace, cmd, false); + + + TenantId = id.ToString(); + } + catch (Exception ex) + { + HostedSolutionLog.LogError("CreateOrganizationInternal", ex); + RollbackTransaction(transaction); + throw; + } + finally + { + + CloseRunspace(runSpace); + } + + HostedSolutionLog.LogEnd("CreateOrganizationInternal"); + + return TenantId; + } + + + + private bool DeleteOrganizationInternal(string organizationId, string sipDomain) + { + HostedSolutionLog.LogStart("DeleteOrganizationInternal"); + HostedSolutionLog.DebugInfo("organizationId: {0}", organizationId); + HostedSolutionLog.DebugInfo("sipDomain: {0}", sipDomain); + + bool ret = true; + + Runspace runSpace = null; + try + { + runSpace = OpenRunspace(); + + Command cmd = new Command("Get-CsTenant"); + cmd.Parameters.Add("Identity", GetOrganizationPath(organizationId)); + Collection result = ExecuteShellCommand(runSpace, cmd, false); + if ((result != null) && (result.Count > 0)) + { + Guid tenantId = (Guid)GetPSObjectProperty(result[0], "TenantId"); + + // create sip domain + DeleteSipDomain(runSpace, sipDomain); + + //clear the msRTCSIP-Domains, TenantID, ObjectID + string path = AddADPrefix(GetOrganizationPath(organizationId)); + DirectoryEntry ou = ActiveDirectoryUtils.GetADObject(path); + ActiveDirectoryUtils.ClearADObjectPropertyValue(ou, "msRTCSIP-Domains"); + ActiveDirectoryUtils.ClearADObjectPropertyValue(ou, "msRTCSIP-TenantId"); + ActiveDirectoryUtils.ClearADObjectPropertyValue(ou, "msRTCSIP-ObjectId"); + ou.CommitChanges(); + + try + { + DeleteConferencingPolicy(runSpace, organizationId); + } + catch (Exception) + { + } + + try + { + DeleteExternalAccessPolicy(runSpace, organizationId); + } + catch (Exception) + { + } + + try + { + DeleteMobilityPolicy(runSpace, organizationId + " EnableOutSideVoice"); + } + catch (Exception) + { + } + + try + { + DeleteMobilityPolicy(runSpace, organizationId + " DisableOutSideVoice"); + } + catch (Exception) + { + } + + try + { + DeleteSimpleUrl(runSpace, sipDomain, tenantId); + } + catch (Exception) + { + } + } + + cmd = new Command("Invoke-CsManagementStoreReplication"); + ExecuteShellCommand(runSpace, cmd, false); + + } + catch (Exception ex) + { + ret = false; + HostedSolutionLog.LogError("DeleteOrganizationInternal", ex); + throw; + } + finally + { + + CloseRunspace(runSpace); + } + HostedSolutionLog.LogEnd("DeleteOrganizationInternal"); + return ret; + } + #endregion + + #region Users + private bool CreateUserInternal(string organizationId, string userUpn, LyncUserPlan plan) + { + HostedSolutionLog.LogStart("CreateUserInternal"); + HostedSolutionLog.DebugInfo("organizationId: {0}", organizationId); + HostedSolutionLog.DebugInfo("userUpn: {0}", userUpn); + + bool ret = true; + Guid tenantId = Guid.Empty; + + LyncTransaction transaction = StartTransaction(); + + Runspace runSpace = null; + try + { + runSpace = OpenRunspace(); + + Command cmd = new Command("Get-CsTenant"); + cmd.Parameters.Add("Identity", GetOrganizationPath(organizationId)); + Collection result = ExecuteShellCommand(runSpace, cmd, false); + if ((result != null) && (result.Count > 0)) + { + tenantId = (Guid)GetPSObjectProperty(result[0], "TenantId"); + + //enable for lync + cmd = new Command("Enable-CsUser"); + cmd.Parameters.Add("Identity", userUpn); + cmd.Parameters.Add("RegistrarPool", PoolFQDN); + cmd.Parameters.Add("SipAddressType", "UserPrincipalName"); + ExecuteShellCommand(runSpace, cmd); + + transaction.RegisterNewCsUser(userUpn); + + //set groupingID and tenantID + cmd = new Command("Get-CsAdUser"); + cmd.Parameters.Add("Identity", userUpn); + result = ExecuteShellCommand(runSpace, cmd); + + + string path = AddADPrefix(GetResultObjectDN(result)); + DirectoryEntry user = ActiveDirectoryUtils.GetADObject(path); + ActiveDirectoryUtils.SetADObjectPropertyValue(user, "msRTCSIP-GroupingID", tenantId); + ActiveDirectoryUtils.SetADObjectPropertyValue(user, "msRTCSIP-TenantId", tenantId); + + string[] tmp = userUpn.Split('@'); + if (tmp.Length > 0) + { + string Url = SimpleUrlRoot + tmp[1]; + ActiveDirectoryUtils.SetADObjectPropertyValue(user, "msRTCSIP-BaseSimpleUrl", Url); + } + user.CommitChanges(); + + //set-plan + SetLyncUserPlanInternal(organizationId, userUpn, plan, runSpace); + + //initiate addressbook generation + cmd = new Command("Update-CsAddressBook"); + ExecuteShellCommand(runSpace, cmd, false); + + //initiate user database replication + cmd = new Command("Update-CsUserDatabase"); + ExecuteShellCommand(runSpace, cmd, false); + } + else + { + ret = false; + HostedSolutionLog.LogError("Failed to retrieve tenantID", null); + } + } + catch (Exception ex) + { + ret = false; + HostedSolutionLog.LogError("CreateUserInternal", ex); + RollbackTransaction(transaction); + throw; + } + finally + { + + CloseRunspace(runSpace); + } + HostedSolutionLog.LogEnd("CreateUserInternal"); + return ret; + } + + private LyncUser GetLyncUserGeneralSettingsInternal(string organizationId, string userUpn) + { + HostedSolutionLog.LogStart("GetLyncUserGeneralSettingsInternal"); + HostedSolutionLog.DebugInfo("organizationId: {0}", organizationId); + HostedSolutionLog.DebugInfo("userUpn: {0}", userUpn); + + LyncUser lyncUser = new LyncUser(); + Runspace runSpace = null; + try + { + runSpace = OpenRunspace(); + + Command cmd = new Command("Get-CsUser"); + cmd.Parameters.Add("Identity", userUpn); + Collection result = ExecuteShellCommand(runSpace, cmd); + PSObject user = result[0]; + + lyncUser.DisplayName = (string)GetPSObjectProperty(user, "DisplayName"); + lyncUser.PrimaryUri = (string)GetPSObjectProperty(user, "SipAddress"); + lyncUser.LineUri = (string)GetPSObjectProperty(user, "LineURI"); + } + catch (Exception ex) + { + HostedSolutionLog.LogError("GetLyncUserGeneralSettingsInternal", ex); + throw; + } + finally + { + CloseRunspace(runSpace); + } + HostedSolutionLog.LogEnd("GetLyncUserGeneralSettingsInternal"); + return lyncUser; + } + + + private bool SetLyncUserPlanInternal(string organizationId, string userUpn, LyncUserPlan plan, Runspace runSpace) + { + HostedSolutionLog.LogStart("SetLyncUserPlanInternal"); + HostedSolutionLog.DebugInfo("organizationId: {0}", organizationId); + HostedSolutionLog.DebugInfo("userUpn: {0}", userUpn); + bool ret = true; + bool bCloseRunSpace = false; + + try + { + if (runSpace == null) + { + runSpace = OpenRunspace(); + bCloseRunSpace = true; + } + + //CsExternalAccessPolicy + Command cmd = new Command("Grant-CsExternalAccessPolicy"); + cmd.Parameters.Add("Identity", userUpn); + cmd.Parameters.Add("PolicyName", plan.Federation ? organizationId : null); + ExecuteShellCommand(runSpace, cmd); + + //CsConferencingPolicy + cmd = new Command("Grant-CsConferencingPolicy"); + cmd.Parameters.Add("Identity", userUpn); + cmd.Parameters.Add("PolicyName", plan.Federation ? organizationId : null); + ExecuteShellCommand(runSpace, cmd); + + //CsMobilityPolicy + cmd = new Command("Grant-CsMobilityPolicy"); + cmd.Parameters.Add("Identity", userUpn); + if (plan.Mobility) + cmd.Parameters.Add("PolicyName", plan.MobilityEnableOutsideVoice ? organizationId + " EnableOutSideVoice" : organizationId + " DisableOutSideVoice"); + else + cmd.Parameters.Add("PolicyName", null); + ExecuteShellCommand(runSpace, cmd); + + //initiate user database replication + cmd = new Command("Update-CsUserDatabase"); + ExecuteShellCommand(runSpace, cmd, false); + } + catch (Exception ex) + { + ret = false; + HostedSolutionLog.LogError("SetLyncUserPlanInternal", ex); + throw; + } + finally + { + + if (bCloseRunSpace) CloseRunspace(runSpace); + } + HostedSolutionLog.LogEnd("SetLyncUserPlanInternal"); + return ret; + } + + + private bool DeleteUserInternal(string userUpn) + { + HostedSolutionLog.LogStart("DeleteUserInternal"); + HostedSolutionLog.DebugInfo("userUpn: {0}", userUpn); + + bool ret = true; + + Runspace runSpace = null; + try + { + runSpace = OpenRunspace(); + + //Delete User + DeleteUser(runSpace, userUpn); + + //Clear groupingID and tenantID + Command cmd = new Command("Get-CsAdUser"); + cmd.Parameters.Add("Identity", userUpn); + Collection result = ExecuteShellCommand(runSpace, cmd); + + string path = AddADPrefix(GetResultObjectDN(result)); + DirectoryEntry user = ActiveDirectoryUtils.GetADObject(path); + ActiveDirectoryUtils.ClearADObjectPropertyValue(user, "msRTCSIP-GroupingID"); + ActiveDirectoryUtils.ClearADObjectPropertyValue(user, "msRTCSIP-TenantId"); + ActiveDirectoryUtils.ClearADObjectPropertyValue(user, "msRTCSIP-BaseSimpleUrl"); + user.CommitChanges(); + + //initiate addressbook generation + cmd = new Command("Update-CsAddressBook"); + ExecuteShellCommand(runSpace, cmd, false); + + //initiate user database replication + cmd = new Command("Update-CsUserDatabase"); + ExecuteShellCommand(runSpace, cmd, false); + } + catch (Exception ex) + { + ret = false; + HostedSolutionLog.LogError("DeleteUserInternal", ex); + throw; + } + finally + { + + CloseRunspace(runSpace); + } + HostedSolutionLog.LogEnd("DeleteUserInternal"); + return ret; + } + + internal void DeleteUser(Runspace runSpace, string userUpn) + { + HostedSolutionLog.LogStart("DeleteUser"); + HostedSolutionLog.DebugInfo("userUpn : {0}", userUpn); + Command cmd = new Command("Disable-CsUser"); + cmd.Parameters.Add("Identity", userUpn); + cmd.Parameters.Add("Confirm", false); + ExecuteShellCommand(runSpace, cmd, false); + HostedSolutionLog.LogEnd("DeleteUser"); + } + + #endregion + + #region SipDomains + internal void DeleteSipDomain(Runspace runSpace, string id) + { + HostedSolutionLog.LogStart("DeleteSipDomain"); + HostedSolutionLog.DebugInfo("SipDomain : {0}", id); + Command cmd = new Command("Remove-CsSipDomain"); + cmd.Parameters.Add("Identity", id); + cmd.Parameters.Add("Confirm", false); + cmd.Parameters.Add("Force", true); + ExecuteShellCommand(runSpace, cmd, false); + HostedSolutionLog.LogEnd("DeleteSipDomain"); + } + + private void CreateSimpleUrl(Runspace runSpace, string sipDomain, Guid id) + { + //Create the simpleUrlEntry + Command cmd = new Command("Get-CsSipDomain"); + Collection sipDomains = ExecuteShellCommand(runSpace, cmd, false); + + IList SimpleUrls = new List(); + + + foreach (PSObject domain in sipDomains) + { + string d = (string)GetPSObjectProperty(domain, "Name"); + string Url = SimpleUrlRoot + d; + + + //Create the simpleUrlEntry + cmd = new Command("New-CsSimpleUrlEntry"); + cmd.Parameters.Add("Url", Url); + Collection simpleUrlEntry = ExecuteShellCommand(runSpace, cmd, false); + + //Create the simpleUrl + cmd = new Command("New-CsSimpleUrl"); + cmd.Parameters.Add("Component", "meet"); + cmd.Parameters.Add("Domain", d); + cmd.Parameters.Add("SimpleUrl", simpleUrlEntry[0]); + cmd.Parameters.Add("ActiveUrl", Url); + Collection simpleUrl = ExecuteShellCommand(runSpace, cmd, false); + + SimpleUrls.Add(simpleUrl[0]); + } + + Hashtable properties = new Hashtable(); + properties.Add("Add", SimpleUrls); + + //PSListModifier + cmd = new Command("Set-CsSimpleUrlConfiguration"); + cmd.Parameters.Add("Identity", "Global"); + cmd.Parameters.Add("Tenant", id); + cmd.Parameters.Add("SimpleUrl", SimpleUrls); + ExecuteShellCommand(runSpace, cmd, false); + } + + + internal void DeleteSimpleUrl(Runspace runSpace, string sipDomain, Guid id) + { + /* + //build the url + string Url = SimpleUrlRoot + sipDomain; + + //Create the simpleUrlEntry + Command cmd = new Command("New-CsSimpleUrlEntry"); + cmd.Parameters.Add("Url", Url); + Collection simpleUrlEntry = ExecuteShellCommand(runSpace, cmd, false); + + //Create the simpleUrl + cmd = new Command("New-CsSimpleUrl"); + cmd.Parameters.Add("Component", "meet"); + cmd.Parameters.Add("Domain", sipDomain); + cmd.Parameters.Add("SimpleUrl", simpleUrlEntry[0]); + cmd.Parameters.Add("ActiveUrl", Url); + Collection simpleUrl = ExecuteShellCommand(runSpace, cmd, false); + + //PSListModifier + + Hashtable properties = new Hashtable(); + properties.Add("Remove", simpleUrl[0]); + + cmd = new Command("Set-CsSimpleUrlConfiguration"); + cmd.Parameters.Add("Identity", "Global"); + cmd.Parameters.Add("Tenant", id); + cmd.Parameters.Add("SimpleUrl", properties); + ExecuteShellCommand(runSpace, cmd, false); + */ + } + + + #endregion + + #region Policies + + internal void DeleteConferencingPolicy(Runspace runSpace, string policyName) + { + HostedSolutionLog.LogStart("DeleteConferencingPolicy"); + HostedSolutionLog.DebugInfo("policyName : {0}", policyName); + Command cmd = new Command("Remove-CsConferencingPolicy"); + cmd.Parameters.Add("Identity", policyName); + cmd.Parameters.Add("Confirm", false); + cmd.Parameters.Add("Force", true); + ExecuteShellCommand(runSpace, cmd, false); + HostedSolutionLog.LogEnd("DeleteConferencingPolicy"); + } + + internal void DeleteExternalAccessPolicy(Runspace runSpace, string policyName) + { + HostedSolutionLog.LogStart("DeleteExternalAccessPolicy"); + HostedSolutionLog.DebugInfo("policyName : {0}", policyName); + Command cmd = new Command("Remove-CsExternalAccessPolicy"); + cmd.Parameters.Add("Identity", policyName); + cmd.Parameters.Add("Confirm", false); + cmd.Parameters.Add("Force", true); + ExecuteShellCommand(runSpace, cmd, false); + HostedSolutionLog.LogEnd("DeleteExternalAccessPolicy"); + } + + internal void DeleteMobilityPolicy(Runspace runSpace, string policyName) + { + HostedSolutionLog.LogStart("DeleteMobilityPolicy"); + HostedSolutionLog.DebugInfo("policyName : {0}", policyName); + Command cmd = new Command("Remove-CsMobilityPolicy"); + cmd.Parameters.Add("Identity", policyName); + cmd.Parameters.Add("Confirm", false); + cmd.Parameters.Add("Force", true); + ExecuteShellCommand(runSpace, cmd, false); + HostedSolutionLog.LogEnd("DeleteMobilityPolicy"); + } + + #endregion + + #region Sytsem Related Methods + private void ReloadConfigurationInternal() + { + HostedSolutionLog.LogStart("ReloadConfigurationInternal"); + Runspace runSpace = null; + try + { + runSpace = OpenRunspace(); + + Command cmd = new Command("Enable-CsComputer"); + ExecuteShellCommand(runSpace, cmd, false); + } + catch (Exception ex) + { + HostedSolutionLog.LogError("ReloadConfigurationInternal", ex); + throw; + } + finally + { + + CloseRunspace(runSpace); + } + HostedSolutionLog.LogEnd("ReloadConfigurationInternal"); + } + + + #endregion + + #region Federation Domains + private LyncFederationDomain[] GetFederationDomainsInternal(string organizationId) + { + + HostedSolutionLog.LogStart("GetFederationDomainsInternal"); + HostedSolutionLog.DebugInfo("organizationId: {0}", organizationId); + + + LyncFederationDomain[] domains = null; + + Runspace runSpace = null; + try + { + runSpace = OpenRunspace(); + + Guid tenantId = Guid.Empty; + + domains = GetFederationDomainsInternal(runSpace, organizationId, ref tenantId); + + } + catch (Exception ex) + { + HostedSolutionLog.LogError("GetFederationDomainsInternal", ex); + throw; + } + finally + { + + CloseRunspace(runSpace); + } + HostedSolutionLog.LogEnd("GetFederationDomainsInternal"); + + return domains; + } + + private LyncFederationDomain[] GetFederationDomainsInternal(Runspace runSpace, string organizationId, ref Guid tenantId) + { + //Get TenantID + List domains = null; + Command cmd = new Command("Get-CsTenant"); + cmd.Parameters.Add("Identity", GetOrganizationPath(organizationId)); + Collection result = ExecuteShellCommand(runSpace, cmd, false); + if ((result != null) && (result.Count > 0)) + { + tenantId = (Guid)GetPSObjectProperty(result[0], "TenantId"); + + //Get-CSTenantFederationConfiguration (AllowedDomains) + cmd = new Command("Get-CsTenantFederationConfiguration"); + cmd.Parameters.Add("Tenant", tenantId); + result = ExecuteShellCommand(runSpace, cmd, false); + + if ((result != null) && (result.Count > 0)) + { + domains = new List(); + + if (GetPSObjectProperty(result[0], "AllowedDomains").GetType().ToString() == "Microsoft.Rtc.Management.WritableConfig.Settings.Edge.AllowList") + { + AllowList allowList = (AllowList)GetPSObjectProperty(result[0], "AllowedDomains"); + + foreach (DomainPattern d in allowList.AllowedDomain) + { + LyncFederationDomain domain = new LyncFederationDomain(); + domain.DomainName = d.Domain.ToString(); + domains.Add(domain); + } + } + } + } + + if (domains != null) + return domains.ToArray(); + else + return null; + } + + + private bool AddFederationDomainInternal(string organizationId, string domainName, string proxyFqdn) + { + HostedSolutionLog.LogStart("AddFederationDomainInternal"); + HostedSolutionLog.DebugInfo("organizationId: {0}", organizationId); + HostedSolutionLog.DebugInfo("domainName: {0}", domainName); + + Runspace runSpace = null; + try + { + runSpace = OpenRunspace(); + + Guid tenantId = Guid.Empty; + Command cmd = new Command("Get-CsTenant"); + cmd.Parameters.Add("Identity", GetOrganizationPath(organizationId)); + Collection result = ExecuteShellCommand(runSpace, cmd, false); + if ((result != null) && (result.Count > 0)) + { + tenantId = (Guid)GetPSObjectProperty(result[0], "TenantId"); + + //Get-CSTenantFederationConfiguration (AllowedDomains) + cmd = new Command("Get-CsTenantFederationConfiguration"); + cmd.Parameters.Add("Tenant", tenantId); + result = ExecuteShellCommand(runSpace, cmd, false); + + if ((result != null) && (result.Count > 0)) + { + AllowList allowList = null; + + if (GetPSObjectProperty(result[0], "AllowedDomains").GetType().ToString() == "Microsoft.Rtc.Management.WritableConfig.Settings.Edge.AllowList") + { + allowList = (AllowList)GetPSObjectProperty(result[0], "AllowedDomains"); + DomainPattern domain = new DomainPattern(domainName); + allowList.AllowedDomain.Add(domain); + } + else + { + allowList = new AllowList(); + DomainPattern domain = new DomainPattern(domainName); + allowList.AllowedDomain.Add(domain); + } + + cmd = new Command("Set-CsTenantFederationConfiguration"); + cmd.Parameters.Add("Tenant", tenantId); + cmd.Parameters.Add("AllowedDomains", allowList); + ExecuteShellCommand(runSpace, cmd, false); + } + } + } + catch (Exception ex) + { + HostedSolutionLog.LogError("AddFederationDomainInternal", ex); + throw; + } + finally + { + + CloseRunspace(runSpace); + } + HostedSolutionLog.LogEnd("AddFederationDomainInternal"); + + return true; + } + + private bool RemoveFederationDomainInternal(string organizationId, string domainName) + { + HostedSolutionLog.LogStart("RemoveFederationDomainInternal"); + HostedSolutionLog.DebugInfo("organizationId: {0}", organizationId); + HostedSolutionLog.DebugInfo("domainName: {0}", domainName); + + Runspace runSpace = null; + try + { + runSpace = OpenRunspace(); + + Guid tenantId = Guid.Empty; + Command cmd = new Command("Get-CsTenant"); + cmd.Parameters.Add("Identity", GetOrganizationPath(organizationId)); + Collection result = ExecuteShellCommand(runSpace, cmd, false); + if ((result != null) && (result.Count > 0)) + { + tenantId = (Guid)GetPSObjectProperty(result[0], "TenantId"); + + //Get-CSTenantFederationConfiguration (AllowedDomains) + cmd = new Command("Get-CsTenantFederationConfiguration"); + cmd.Parameters.Add("Tenant", tenantId); + result = ExecuteShellCommand(runSpace, cmd, false); + + if ((result != null) && (result.Count > 0)) + { + AllowList allowList = null; + + if (GetPSObjectProperty(result[0], "AllowedDomains").GetType().ToString() == "Microsoft.Rtc.Management.WritableConfig.Settings.Edge.AllowList") + { + allowList = (AllowList)GetPSObjectProperty(result[0], "AllowedDomains"); + DomainPattern domain = new DomainPattern(domainName); + allowList.AllowedDomain.Remove(domain); + } + + cmd = new Command("Set-CsTenantFederationConfiguration"); + cmd.Parameters.Add("Tenant", tenantId); + cmd.Parameters.Add("AllowedDomains", allowList); + ExecuteShellCommand(runSpace, cmd, false); + } + } + } + catch (Exception ex) + { + HostedSolutionLog.LogError("RemoveFederationDomainInternal", ex); + throw; + } + finally + { + + CloseRunspace(runSpace); + } + HostedSolutionLog.LogEnd("RemoveFederationDomainInternal"); + + return true; + } + + + + + #endregion + + #region PowerShell integration + private static InitialSessionState session = null; + + internal virtual Runspace OpenRunspace() + { + HostedSolutionLog.LogStart("OpenRunspace"); + + if (session == null) + { + session = InitialSessionState.CreateDefault(); + session.ImportPSModule(new string[] { "ActiveDirectory", "Lync", "LyncOnline" }); + } + Runspace runSpace = RunspaceFactory.CreateRunspace(session); + // + runSpace.Open(); + // + runSpace.SessionStateProxy.SetVariable("ConfirmPreference", "none"); + HostedSolutionLog.LogEnd("OpenRunspace"); + return runSpace; + } + + internal void CloseRunspace(Runspace runspace) + { + try + { + if (runspace != null && runspace.RunspaceStateInfo.State == RunspaceState.Opened) + { + runspace.Close(); + } + } + catch (Exception ex) + { + HostedSolutionLog.LogError("Runspace error", ex); + } + } + + internal Collection ExecuteShellCommand(Runspace runSpace, Command cmd) + { + return ExecuteShellCommand(runSpace, cmd, true); + } + + internal Collection ExecuteShellCommand(Runspace runSpace, Command cmd, bool useDomainController) + { + object[] errors; + return ExecuteShellCommand(runSpace, cmd, useDomainController, out errors); + } + + internal Collection ExecuteShellCommand(Runspace runSpace, Command cmd, out object[] errors) + { + return ExecuteShellCommand(runSpace, cmd, true, out errors); + } + + internal Collection ExecuteShellCommand(Runspace runSpace, Command cmd, bool useDomainController, out object[] errors) + { + HostedSolutionLog.LogStart("ExecuteShellCommand"); + List errorList = new List(); + + if (useDomainController) + { + CommandParameter dc = new CommandParameter("DomainController", PrimaryDomainController); + if (!cmd.Parameters.Contains(dc)) + { + cmd.Parameters.Add(dc); + } + } + + HostedSolutionLog.DebugCommand(cmd); + Collection results = null; + // Create a pipeline + Pipeline pipeLine = runSpace.CreatePipeline(); + using (pipeLine) + { + // Add the command + pipeLine.Commands.Add(cmd); + // Execute the pipeline and save the objects returned. + results = pipeLine.Invoke(); + + // Log out any errors in the pipeline execution + // NOTE: These errors are NOT thrown as exceptions! + // Be sure to check this to ensure that no errors + // happened while executing the command. + if (pipeLine.Error != null && pipeLine.Error.Count > 0) + { + foreach (object item in pipeLine.Error.ReadToEnd()) + { + errorList.Add(item); + string errorMessage = string.Format("Invoke error: {0}", item); + HostedSolutionLog.LogWarning(errorMessage); + } + } + } + pipeLine = null; + errors = errorList.ToArray(); + HostedSolutionLog.LogEnd("ExecuteShellCommand"); + return results; + } + + internal object GetPSObjectProperty(PSObject obj, string name) + { + return obj.Members[name].Value; + } + + /// + /// Returns the identity of the object from the shell execution result + /// + /// + /// + internal string GetResultObjectIdentity(Collection result) + { + HostedSolutionLog.LogStart("GetResultObjectIdentity"); + if (result == null) + throw new ArgumentNullException("result", "Execution result is not specified"); + + if (result.Count < 1) + throw new ArgumentException("Execution result is empty", "result"); + + if (result.Count > 1) + throw new ArgumentException("Execution result contains more than one object", "result"); + + PSMemberInfo info = result[0].Members["Identity"]; + if (info == null) + throw new ArgumentException("Execution result does not contain Identity property", "result"); + + string ret = info.Value.ToString(); + HostedSolutionLog.LogEnd("GetResultObjectIdentity"); + return ret; + } + + internal string GetResultObjectDN(Collection result) + { + HostedSolutionLog.LogStart("GetResultObjectDN"); + if (result == null) + throw new ArgumentNullException("result", "Execution result is not specified"); + + if (result.Count < 1) + throw new ArgumentException("Execution result does not contain any object"); + + if (result.Count > 1) + throw new ArgumentException("Execution result contains more than one object"); + + PSMemberInfo info = result[0].Members["DistinguishedName"]; + if (info == null) + throw new ArgumentException("Execution result does not contain DistinguishedName property", "result"); + + string ret = info.Value.ToString(); + HostedSolutionLog.LogEnd("GetResultObjectDN"); + return ret; + } + + + #endregion + + #region Transactions + + internal LyncTransaction StartTransaction() + { + return new LyncTransaction(); + } + + internal void RollbackTransaction(LyncTransaction transaction) + { + HostedSolutionLog.LogStart("RollbackTransaction"); + Runspace runSpace = null; + try + { + runSpace = OpenRunspace(); + + + for (int i = transaction.Actions.Count - 1; i > -1; i--) + { + //reverse order + try + { + RollbackAction(transaction.Actions[i], runSpace); + } + catch (Exception ex) + { + HostedSolutionLog.LogError("Rollback error", ex); + } + } + } + catch (Exception ex) + { + HostedSolutionLog.LogError("Rollback error", ex); + } + finally + { + + CloseRunspace(runSpace); + } + HostedSolutionLog.LogEnd("RollbackTransaction"); + } + + private void RollbackAction(TransactionAction action, Runspace runspace) + { + HostedSolutionLog.LogInfo("Rollback action: {0}", action.ActionType); + switch (action.ActionType) + { + case TransactionAction.TransactionActionTypes.LyncNewSipDomain: + DeleteSipDomain(runspace, action.Id); + break; + //case TransactionAction.TransactionActionTypes.LyncNewSimpleUrl: + //DeleteSimpleUrl(runspace, action.Id); + //break; + case TransactionAction.TransactionActionTypes.LyncNewUser: + DeleteUser(runspace, action.Id); + break; + case TransactionAction.TransactionActionTypes.LyncNewConferencingPolicy: + DeleteConferencingPolicy(runspace, action.Id); + break; + case TransactionAction.TransactionActionTypes.LyncNewExternalAccessPolicy: + DeleteExternalAccessPolicy(runspace, action.Id); + break; + case TransactionAction.TransactionActionTypes.LyncNewMobilityPolicy: + DeleteMobilityPolicy(runspace, action.Id); + break; + } + } + + #endregion + + #region helpers + private string GetOrganizationPath(string organizationId) + { + StringBuilder sb = new StringBuilder(); + // append provider + AppendOUPath(sb, organizationId); + AppendOUPath(sb, RootOU); + AppendDomainPath(sb, RootDomain); + + return sb.ToString(); + } + + private static void AppendOUPath(StringBuilder sb, string ou) + { + if (string.IsNullOrEmpty(ou)) + return; + + string path = ou.Replace("/", "\\"); + string[] parts = path.Split('\\'); + for (int i = parts.Length - 1; i != -1; i--) + sb.Append("OU=").Append(parts[i]).Append(","); + } + + private static void AppendDomainPath(StringBuilder sb, string domain) + { + if (string.IsNullOrEmpty(domain)) + return; + + string[] parts = domain.Split('.'); + for (int i = 0; i < parts.Length; i++) + { + sb.Append("DC=").Append(parts[i]); + + if (i < (parts.Length - 1)) + sb.Append(","); + } + } + + internal string AddADPrefix(string path) + { + string dn = path; + if (!dn.ToUpper().StartsWith("LDAP://")) + { + dn = string.Format("LDAP://{0}/{1}", PrimaryDomainController, dn); + } + return dn; + } + + #endregion + + public override bool IsInstalled() + { + string value = ""; + bool bResult = false; + RegistryKey root = Registry.LocalMachine; + RegistryKey rk = root.OpenSubKey(LyncRegistryPath); + if (rk != null) + { + value = (string)rk.GetValue("ProductVersion", null); + if (value == "4.0.7577.0") + bResult = true; + + rk.Close(); + } + return bResult; + } + } +} \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.Providers.HostedSolution/LyncTransaction.cs b/WebsitePanel/Sources/WebsitePanel.Providers.HostedSolution/LyncTransaction.cs new file mode 100644 index 00000000..811a93ec --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.Providers.HostedSolution/LyncTransaction.cs @@ -0,0 +1,97 @@ +// Copyright (c) 2012, Outercurve Foundation. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// - Redistributions of source code must retain the above copyright notice, this +// list of conditions and the following disclaimer. +// +// - Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// - Neither the name of the Outercurve Foundation nor the names of its +// contributors may be used to endorse or promote products derived from this +// software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +using System.Collections.Generic; + +namespace WebsitePanel.Providers.HostedSolution +{ + internal class LyncTransaction + { + List actions = null; + + public LyncTransaction() + { + actions = new List(); + } + + internal List Actions + { + get { return actions; } + } + + internal void RegisterNewSipDomain(string id) + { + TransactionAction action = new TransactionAction(); + action.ActionType = TransactionAction.TransactionActionTypes.LyncNewSipDomain; + action.Id = id; + Actions.Add(action); + } + + internal void RegisterNewSimpleUrl(string sipDomain, string tenantID) + { + TransactionAction action = new TransactionAction(); + action.ActionType = TransactionAction.TransactionActionTypes.LyncNewSimpleUrl; + action.Id = sipDomain; + action.Account = tenantID; + Actions.Add(action); + } + + + internal void RegisterNewConferencingPolicy(string id) + { + TransactionAction action = new TransactionAction(); + action.ActionType = TransactionAction.TransactionActionTypes.LyncNewConferencingPolicy; + action.Id = id; + Actions.Add(action); + } + + internal void RegisterNewCsExternalAccessPolicy(string id) + { + TransactionAction action = new TransactionAction(); + action.ActionType = TransactionAction.TransactionActionTypes.LyncNewExternalAccessPolicy; + action.Id = id; + Actions.Add(action); + } + + internal void RegisterNewCsMobilityPolicy(string id) + { + TransactionAction action = new TransactionAction(); + action.ActionType = TransactionAction.TransactionActionTypes.LyncNewMobilityPolicy; + action.Id = id; + Actions.Add(action); + } + + internal void RegisterNewCsUser(string id) + { + TransactionAction action = new TransactionAction(); + action.ActionType = TransactionAction.TransactionActionTypes.LyncNewUser; + action.Id = id; + Actions.Add(action); + } + } +} diff --git a/WebsitePanel/Sources/WebsitePanel.Providers.HostedSolution/WebsitePanel.Providers.HostedSolution.csproj b/WebsitePanel/Sources/WebsitePanel.Providers.HostedSolution/WebsitePanel.Providers.HostedSolution.csproj index a1441425..20a414bf 100644 --- a/WebsitePanel/Sources/WebsitePanel.Providers.HostedSolution/WebsitePanel.Providers.HostedSolution.csproj +++ b/WebsitePanel/Sources/WebsitePanel.Providers.HostedSolution/WebsitePanel.Providers.HostedSolution.csproj @@ -106,6 +106,15 @@ False ..\..\Lib\References\Microsoft\Microsoft.Exchange.Net.dll + + ..\..\Lib\References\Microsoft\Microsoft.Rtc.Management.Core.dll + + + ..\..\Lib\References\Microsoft\Microsoft.Rtc.Management.Hosted.dll + + + ..\..\Lib\References\Microsoft\Microsoft.Rtc.Management.WritableConfig.dll + ..\..\Lib\References\Microsoft\Microsoft.SharePoint.dll False @@ -133,6 +142,8 @@ + + diff --git a/WebsitePanel/Sources/WebsitePanel.Server.Client/LyncServerProxy.cs b/WebsitePanel/Sources/WebsitePanel.Server.Client/LyncServerProxy.cs new file mode 100644 index 00000000..49a11f35 --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.Server.Client/LyncServerProxy.cs @@ -0,0 +1,912 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:2.0.50727.5456 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +// +// This source code was auto-generated by wsdl, Version=2.0.50727.42. +// +using WebsitePanel.Providers.HostedSolution; + +namespace WebsitePanel.Providers.Lync +{ + using System.Xml.Serialization; + using System.Web.Services; + using System.ComponentModel; + using System.Web.Services.Protocols; + using System; + using System.Diagnostics; + + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Web.Services.WebServiceBindingAttribute(Name = "LyncServerSoap", Namespace = "http://smbsaas/websitepanel/server/")] + public partial class LyncServer : Microsoft.Web.Services3.WebServicesClientProtocol + { + + public ServiceProviderSettingsSoapHeader ServiceProviderSettingsSoapHeaderValue; + + private System.Threading.SendOrPostCallback CreateOrganizationOperationCompleted; + + private System.Threading.SendOrPostCallback DeleteOrganizationOperationCompleted; + + private System.Threading.SendOrPostCallback CreateUserOperationCompleted; + + private System.Threading.SendOrPostCallback GetLyncUserGeneralSettingsOperationCompleted; + + private System.Threading.SendOrPostCallback SetLyncUserPlanOperationCompleted; + + private System.Threading.SendOrPostCallback DeleteUserOperationCompleted; + + private System.Threading.SendOrPostCallback GetFederationDomainsOperationCompleted; + + private System.Threading.SendOrPostCallback AddFederationDomainOperationCompleted; + + private System.Threading.SendOrPostCallback RemoveFederationDomainOperationCompleted; + + private System.Threading.SendOrPostCallback ReloadConfigurationOperationCompleted; + + /// + public LyncServer() + { + this.Url = "http://localhost:9003/LyncServer.asmx"; + } + + /// + public event CreateOrganizationCompletedEventHandler CreateOrganizationCompleted; + + /// + public event DeleteOrganizationCompletedEventHandler DeleteOrganizationCompleted; + + /// + public event CreateUserCompletedEventHandler CreateUserCompleted; + + /// + public event GetLyncUserGeneralSettingsCompletedEventHandler GetLyncUserGeneralSettingsCompleted; + + /// + public event SetLyncUserPlanCompletedEventHandler SetLyncUserPlanCompleted; + + /// + public event DeleteUserCompletedEventHandler DeleteUserCompleted; + + /// + public event GetFederationDomainsCompletedEventHandler GetFederationDomainsCompleted; + + /// + public event AddFederationDomainCompletedEventHandler AddFederationDomainCompleted; + + /// + public event RemoveFederationDomainCompletedEventHandler RemoveFederationDomainCompleted; + + /// + public event ReloadConfigurationCompletedEventHandler ReloadConfigurationCompleted; + + /// + [System.Web.Services.Protocols.SoapHeaderAttribute("ServiceProviderSettingsSoapHeaderValue")] + [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://smbsaas/websitepanel/server/CreateOrganization", RequestNamespace = "http://smbsaas/websitepanel/server/", ResponseNamespace = "http://smbsaas/websitepanel/server/", Use = System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle = System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] + public string CreateOrganization(string organizationId, string sipDomain, bool enableConferencing, bool enableConferencingVideo, int maxConferenceSize, bool enabledFederation, bool enabledEnterpriseVoice) + { + object[] results = this.Invoke("CreateOrganization", new object[] { + organizationId, + sipDomain, + enableConferencing, + enableConferencingVideo, + maxConferenceSize, + enabledFederation, + enabledEnterpriseVoice}); + return ((string)(results[0])); + } + + /// + public System.IAsyncResult BeginCreateOrganization(string organizationId, string sipDomain, bool enableConferencing, bool enableConferencingVideo, int maxConferenceSize, bool enabledFederation, bool enabledEnterpriseVoice, System.AsyncCallback callback, object asyncState) + { + return this.BeginInvoke("CreateOrganization", new object[] { + organizationId, + sipDomain, + enableConferencing, + enableConferencingVideo, + maxConferenceSize, + enabledFederation, + enabledEnterpriseVoice}, callback, asyncState); + } + + /// + public string EndCreateOrganization(System.IAsyncResult asyncResult) + { + object[] results = this.EndInvoke(asyncResult); + return ((string)(results[0])); + } + + /// + public void CreateOrganizationAsync(string organizationId, string sipDomain, bool enableConferencing, bool enableConferencingVideo, int maxConferenceSize, bool enabledFederation, bool enabledEnterpriseVoice) + { + this.CreateOrganizationAsync(organizationId, sipDomain, enableConferencing, enableConferencingVideo, maxConferenceSize, enabledFederation, enabledEnterpriseVoice, null); + } + + /// + public void CreateOrganizationAsync(string organizationId, string sipDomain, bool enableConferencing, bool enableConferencingVideo, int maxConferenceSize, bool enabledFederation, bool enabledEnterpriseVoice, object userState) + { + if ((this.CreateOrganizationOperationCompleted == null)) + { + this.CreateOrganizationOperationCompleted = new System.Threading.SendOrPostCallback(this.OnCreateOrganizationOperationCompleted); + } + this.InvokeAsync("CreateOrganization", new object[] { + organizationId, + sipDomain, + enableConferencing, + enableConferencingVideo, + maxConferenceSize, + enabledFederation, + enabledEnterpriseVoice}, this.CreateOrganizationOperationCompleted, userState); + } + + private void OnCreateOrganizationOperationCompleted(object arg) + { + if ((this.CreateOrganizationCompleted != null)) + { + System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); + this.CreateOrganizationCompleted(this, new CreateOrganizationCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); + } + } + + /// + [System.Web.Services.Protocols.SoapHeaderAttribute("ServiceProviderSettingsSoapHeaderValue")] + [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://smbsaas/websitepanel/server/DeleteOrganization", RequestNamespace = "http://smbsaas/websitepanel/server/", ResponseNamespace = "http://smbsaas/websitepanel/server/", Use = System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle = System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] + public bool DeleteOrganization(string organizationId, string sipDomain) + { + object[] results = this.Invoke("DeleteOrganization", new object[] { + organizationId, + sipDomain}); + return ((bool)(results[0])); + } + + /// + public System.IAsyncResult BeginDeleteOrganization(string organizationId, string sipDomain, System.AsyncCallback callback, object asyncState) + { + return this.BeginInvoke("DeleteOrganization", new object[] { + organizationId, + sipDomain}, callback, asyncState); + } + + /// + public bool EndDeleteOrganization(System.IAsyncResult asyncResult) + { + object[] results = this.EndInvoke(asyncResult); + return ((bool)(results[0])); + } + + /// + public void DeleteOrganizationAsync(string organizationId, string sipDomain) + { + this.DeleteOrganizationAsync(organizationId, sipDomain, null); + } + + /// + public void DeleteOrganizationAsync(string organizationId, string sipDomain, object userState) + { + if ((this.DeleteOrganizationOperationCompleted == null)) + { + this.DeleteOrganizationOperationCompleted = new System.Threading.SendOrPostCallback(this.OnDeleteOrganizationOperationCompleted); + } + this.InvokeAsync("DeleteOrganization", new object[] { + organizationId, + sipDomain}, this.DeleteOrganizationOperationCompleted, userState); + } + + private void OnDeleteOrganizationOperationCompleted(object arg) + { + if ((this.DeleteOrganizationCompleted != null)) + { + System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); + this.DeleteOrganizationCompleted(this, new DeleteOrganizationCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); + } + } + + /// + [System.Web.Services.Protocols.SoapHeaderAttribute("ServiceProviderSettingsSoapHeaderValue")] + [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://smbsaas/websitepanel/server/CreateUser", RequestNamespace = "http://smbsaas/websitepanel/server/", ResponseNamespace = "http://smbsaas/websitepanel/server/", Use = System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle = System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] + public bool CreateUser(string organizationId, string userUpn, LyncUserPlan plan) + { + object[] results = this.Invoke("CreateUser", new object[] { + organizationId, + userUpn, + plan}); + return ((bool)(results[0])); + } + + /// + public System.IAsyncResult BeginCreateUser(string organizationId, string userUpn, LyncUserPlan plan, System.AsyncCallback callback, object asyncState) + { + return this.BeginInvoke("CreateUser", new object[] { + organizationId, + userUpn, + plan}, callback, asyncState); + } + + /// + public bool EndCreateUser(System.IAsyncResult asyncResult) + { + object[] results = this.EndInvoke(asyncResult); + return ((bool)(results[0])); + } + + /// + public void CreateUserAsync(string organizationId, string userUpn, LyncUserPlan plan) + { + this.CreateUserAsync(organizationId, userUpn, plan, null); + } + + /// + public void CreateUserAsync(string organizationId, string userUpn, LyncUserPlan plan, object userState) + { + if ((this.CreateUserOperationCompleted == null)) + { + this.CreateUserOperationCompleted = new System.Threading.SendOrPostCallback(this.OnCreateUserOperationCompleted); + } + this.InvokeAsync("CreateUser", new object[] { + organizationId, + userUpn, + plan}, this.CreateUserOperationCompleted, userState); + } + + private void OnCreateUserOperationCompleted(object arg) + { + if ((this.CreateUserCompleted != null)) + { + System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); + this.CreateUserCompleted(this, new CreateUserCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); + } + } + + /// + [System.Web.Services.Protocols.SoapHeaderAttribute("ServiceProviderSettingsSoapHeaderValue")] + [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://smbsaas/websitepanel/server/GetLyncUserGeneralSettings", RequestNamespace = "http://smbsaas/websitepanel/server/", ResponseNamespace = "http://smbsaas/websitepanel/server/", Use = System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle = System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] + public LyncUser GetLyncUserGeneralSettings(string organizationId, string userUpn) + { + object[] results = this.Invoke("GetLyncUserGeneralSettings", new object[] { + organizationId, + userUpn}); + return ((LyncUser)(results[0])); + } + + /// + public System.IAsyncResult BeginGetLyncUserGeneralSettings(string organizationId, string userUpn, System.AsyncCallback callback, object asyncState) + { + return this.BeginInvoke("GetLyncUserGeneralSettings", new object[] { + organizationId, + userUpn}, callback, asyncState); + } + + /// + public LyncUser EndGetLyncUserGeneralSettings(System.IAsyncResult asyncResult) + { + object[] results = this.EndInvoke(asyncResult); + return ((LyncUser)(results[0])); + } + + /// + public void GetLyncUserGeneralSettingsAsync(string organizationId, string userUpn) + { + this.GetLyncUserGeneralSettingsAsync(organizationId, userUpn, null); + } + + /// + public void GetLyncUserGeneralSettingsAsync(string organizationId, string userUpn, object userState) + { + if ((this.GetLyncUserGeneralSettingsOperationCompleted == null)) + { + this.GetLyncUserGeneralSettingsOperationCompleted = new System.Threading.SendOrPostCallback(this.OnGetLyncUserGeneralSettingsOperationCompleted); + } + this.InvokeAsync("GetLyncUserGeneralSettings", new object[] { + organizationId, + userUpn}, this.GetLyncUserGeneralSettingsOperationCompleted, userState); + } + + private void OnGetLyncUserGeneralSettingsOperationCompleted(object arg) + { + if ((this.GetLyncUserGeneralSettingsCompleted != null)) + { + System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); + this.GetLyncUserGeneralSettingsCompleted(this, new GetLyncUserGeneralSettingsCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); + } + } + + /// + [System.Web.Services.Protocols.SoapHeaderAttribute("ServiceProviderSettingsSoapHeaderValue")] + [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://smbsaas/websitepanel/server/SetLyncUserPlan", RequestNamespace = "http://smbsaas/websitepanel/server/", ResponseNamespace = "http://smbsaas/websitepanel/server/", Use = System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle = System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] + public bool SetLyncUserPlan(string organizationId, string userUpn, LyncUserPlan plan) + { + object[] results = this.Invoke("SetLyncUserPlan", new object[] { + organizationId, + userUpn, + plan}); + return ((bool)(results[0])); + } + + /// + public System.IAsyncResult BeginSetLyncUserPlan(string organizationId, string userUpn, LyncUserPlan plan, System.AsyncCallback callback, object asyncState) + { + return this.BeginInvoke("SetLyncUserPlan", new object[] { + organizationId, + userUpn, + plan}, callback, asyncState); + } + + /// + public bool EndSetLyncUserPlan(System.IAsyncResult asyncResult) + { + object[] results = this.EndInvoke(asyncResult); + return ((bool)(results[0])); + } + + /// + public void SetLyncUserPlanAsync(string organizationId, string userUpn, LyncUserPlan plan) + { + this.SetLyncUserPlanAsync(organizationId, userUpn, plan, null); + } + + /// + public void SetLyncUserPlanAsync(string organizationId, string userUpn, LyncUserPlan plan, object userState) + { + if ((this.SetLyncUserPlanOperationCompleted == null)) + { + this.SetLyncUserPlanOperationCompleted = new System.Threading.SendOrPostCallback(this.OnSetLyncUserPlanOperationCompleted); + } + this.InvokeAsync("SetLyncUserPlan", new object[] { + organizationId, + userUpn, + plan}, this.SetLyncUserPlanOperationCompleted, userState); + } + + private void OnSetLyncUserPlanOperationCompleted(object arg) + { + if ((this.SetLyncUserPlanCompleted != null)) + { + System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); + this.SetLyncUserPlanCompleted(this, new SetLyncUserPlanCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); + } + } + + /// + [System.Web.Services.Protocols.SoapHeaderAttribute("ServiceProviderSettingsSoapHeaderValue")] + [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://smbsaas/websitepanel/server/DeleteUser", RequestNamespace = "http://smbsaas/websitepanel/server/", ResponseNamespace = "http://smbsaas/websitepanel/server/", Use = System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle = System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] + public bool DeleteUser(string userUpn) + { + object[] results = this.Invoke("DeleteUser", new object[] { + userUpn}); + return ((bool)(results[0])); + } + + /// + public System.IAsyncResult BeginDeleteUser(string userUpn, System.AsyncCallback callback, object asyncState) + { + return this.BeginInvoke("DeleteUser", new object[] { + userUpn}, callback, asyncState); + } + + /// + public bool EndDeleteUser(System.IAsyncResult asyncResult) + { + object[] results = this.EndInvoke(asyncResult); + return ((bool)(results[0])); + } + + /// + public void DeleteUserAsync(string userUpn) + { + this.DeleteUserAsync(userUpn, null); + } + + /// + public void DeleteUserAsync(string userUpn, object userState) + { + if ((this.DeleteUserOperationCompleted == null)) + { + this.DeleteUserOperationCompleted = new System.Threading.SendOrPostCallback(this.OnDeleteUserOperationCompleted); + } + this.InvokeAsync("DeleteUser", new object[] { + userUpn}, this.DeleteUserOperationCompleted, userState); + } + + private void OnDeleteUserOperationCompleted(object arg) + { + if ((this.DeleteUserCompleted != null)) + { + System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); + this.DeleteUserCompleted(this, new DeleteUserCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); + } + } + + /// + [System.Web.Services.Protocols.SoapHeaderAttribute("ServiceProviderSettingsSoapHeaderValue")] + [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://smbsaas/websitepanel/server/GetFederationDomains", RequestNamespace = "http://smbsaas/websitepanel/server/", ResponseNamespace = "http://smbsaas/websitepanel/server/", Use = System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle = System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] + public LyncFederationDomain[] GetFederationDomains(string organizationId) + { + object[] results = this.Invoke("GetFederationDomains", new object[] { + organizationId}); + return ((LyncFederationDomain[])(results[0])); + } + + /// + public System.IAsyncResult BeginGetFederationDomains(string organizationId, System.AsyncCallback callback, object asyncState) + { + return this.BeginInvoke("GetFederationDomains", new object[] { + organizationId}, callback, asyncState); + } + + /// + public LyncFederationDomain[] EndGetFederationDomains(System.IAsyncResult asyncResult) + { + object[] results = this.EndInvoke(asyncResult); + return ((LyncFederationDomain[])(results[0])); + } + + /// + public void GetFederationDomainsAsync(string organizationId) + { + this.GetFederationDomainsAsync(organizationId, null); + } + + /// + public void GetFederationDomainsAsync(string organizationId, object userState) + { + if ((this.GetFederationDomainsOperationCompleted == null)) + { + this.GetFederationDomainsOperationCompleted = new System.Threading.SendOrPostCallback(this.OnGetFederationDomainsOperationCompleted); + } + this.InvokeAsync("GetFederationDomains", new object[] { + organizationId}, this.GetFederationDomainsOperationCompleted, userState); + } + + private void OnGetFederationDomainsOperationCompleted(object arg) + { + if ((this.GetFederationDomainsCompleted != null)) + { + System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); + this.GetFederationDomainsCompleted(this, new GetFederationDomainsCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); + } + } + + /// + [System.Web.Services.Protocols.SoapHeaderAttribute("ServiceProviderSettingsSoapHeaderValue")] + [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://smbsaas/websitepanel/server/AddFederationDomain", RequestNamespace = "http://smbsaas/websitepanel/server/", ResponseNamespace = "http://smbsaas/websitepanel/server/", Use = System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle = System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] + public bool AddFederationDomain(string organizationId, string domainName, string proxyFqdn) + { + object[] results = this.Invoke("AddFederationDomain", new object[] { + organizationId, + domainName, + proxyFqdn}); + return ((bool)(results[0])); + } + + /// + public System.IAsyncResult BeginAddFederationDomain(string organizationId, string domainName, string proxyFqdn, System.AsyncCallback callback, object asyncState) + { + return this.BeginInvoke("AddFederationDomain", new object[] { + organizationId, + domainName, + proxyFqdn}, callback, asyncState); + } + + /// + public bool EndAddFederationDomain(System.IAsyncResult asyncResult) + { + object[] results = this.EndInvoke(asyncResult); + return ((bool)(results[0])); + } + + /// + public void AddFederationDomainAsync(string organizationId, string domainName, string proxyFqdn) + { + this.AddFederationDomainAsync(organizationId, domainName, proxyFqdn, null); + } + + /// + public void AddFederationDomainAsync(string organizationId, string domainName, string proxyFqdn, object userState) + { + if ((this.AddFederationDomainOperationCompleted == null)) + { + this.AddFederationDomainOperationCompleted = new System.Threading.SendOrPostCallback(this.OnAddFederationDomainOperationCompleted); + } + this.InvokeAsync("AddFederationDomain", new object[] { + organizationId, + domainName, + proxyFqdn}, this.AddFederationDomainOperationCompleted, userState); + } + + private void OnAddFederationDomainOperationCompleted(object arg) + { + if ((this.AddFederationDomainCompleted != null)) + { + System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); + this.AddFederationDomainCompleted(this, new AddFederationDomainCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); + } + } + + /// + [System.Web.Services.Protocols.SoapHeaderAttribute("ServiceProviderSettingsSoapHeaderValue")] + [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://smbsaas/websitepanel/server/RemoveFederationDomain", RequestNamespace = "http://smbsaas/websitepanel/server/", ResponseNamespace = "http://smbsaas/websitepanel/server/", Use = System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle = System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] + public bool RemoveFederationDomain(string organizationId, string domainName) + { + object[] results = this.Invoke("RemoveFederationDomain", new object[] { + organizationId, + domainName}); + return ((bool)(results[0])); + } + + /// + public System.IAsyncResult BeginRemoveFederationDomain(string organizationId, string domainName, System.AsyncCallback callback, object asyncState) + { + return this.BeginInvoke("RemoveFederationDomain", new object[] { + organizationId, + domainName}, callback, asyncState); + } + + /// + public bool EndRemoveFederationDomain(System.IAsyncResult asyncResult) + { + object[] results = this.EndInvoke(asyncResult); + return ((bool)(results[0])); + } + + /// + public void RemoveFederationDomainAsync(string organizationId, string domainName) + { + this.RemoveFederationDomainAsync(organizationId, domainName, null); + } + + /// + public void RemoveFederationDomainAsync(string organizationId, string domainName, object userState) + { + if ((this.RemoveFederationDomainOperationCompleted == null)) + { + this.RemoveFederationDomainOperationCompleted = new System.Threading.SendOrPostCallback(this.OnRemoveFederationDomainOperationCompleted); + } + this.InvokeAsync("RemoveFederationDomain", new object[] { + organizationId, + domainName}, this.RemoveFederationDomainOperationCompleted, userState); + } + + private void OnRemoveFederationDomainOperationCompleted(object arg) + { + if ((this.RemoveFederationDomainCompleted != null)) + { + System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); + this.RemoveFederationDomainCompleted(this, new RemoveFederationDomainCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); + } + } + + /// + [System.Web.Services.Protocols.SoapHeaderAttribute("ServiceProviderSettingsSoapHeaderValue")] + [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://smbsaas/websitepanel/server/ReloadConfiguration", RequestNamespace = "http://smbsaas/websitepanel/server/", ResponseNamespace = "http://smbsaas/websitepanel/server/", Use = System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle = System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] + public void ReloadConfiguration() + { + this.Invoke("ReloadConfiguration", new object[0]); + } + + /// + public System.IAsyncResult BeginReloadConfiguration(System.AsyncCallback callback, object asyncState) + { + return this.BeginInvoke("ReloadConfiguration", new object[0], callback, asyncState); + } + + /// + public void EndReloadConfiguration(System.IAsyncResult asyncResult) + { + this.EndInvoke(asyncResult); + } + + /// + public void ReloadConfigurationAsync() + { + this.ReloadConfigurationAsync(null); + } + + /// + public void ReloadConfigurationAsync(object userState) + { + if ((this.ReloadConfigurationOperationCompleted == null)) + { + this.ReloadConfigurationOperationCompleted = new System.Threading.SendOrPostCallback(this.OnReloadConfigurationOperationCompleted); + } + this.InvokeAsync("ReloadConfiguration", new object[0], this.ReloadConfigurationOperationCompleted, userState); + } + + private void OnReloadConfigurationOperationCompleted(object arg) + { + if ((this.ReloadConfigurationCompleted != null)) + { + System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); + this.ReloadConfigurationCompleted(this, new System.ComponentModel.AsyncCompletedEventArgs(invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); + } + } + + /// + public new void CancelAsync(object userState) + { + base.CancelAsync(userState); + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + public delegate void CreateOrganizationCompletedEventHandler(object sender, CreateOrganizationCompletedEventArgs e); + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + public partial class CreateOrganizationCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs + { + + private object[] results; + + internal CreateOrganizationCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + base(exception, cancelled, userState) + { + this.results = results; + } + + /// + public string Result + { + get + { + this.RaiseExceptionIfNecessary(); + return ((string)(this.results[0])); + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + public delegate void DeleteOrganizationCompletedEventHandler(object sender, DeleteOrganizationCompletedEventArgs e); + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + public partial class DeleteOrganizationCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs + { + + private object[] results; + + internal DeleteOrganizationCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + base(exception, cancelled, userState) + { + this.results = results; + } + + /// + public bool Result + { + get + { + this.RaiseExceptionIfNecessary(); + return ((bool)(this.results[0])); + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + public delegate void CreateUserCompletedEventHandler(object sender, CreateUserCompletedEventArgs e); + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + public partial class CreateUserCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs + { + + private object[] results; + + internal CreateUserCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + base(exception, cancelled, userState) + { + this.results = results; + } + + /// + public bool Result + { + get + { + this.RaiseExceptionIfNecessary(); + return ((bool)(this.results[0])); + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + public delegate void GetLyncUserGeneralSettingsCompletedEventHandler(object sender, GetLyncUserGeneralSettingsCompletedEventArgs e); + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + public partial class GetLyncUserGeneralSettingsCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs + { + + private object[] results; + + internal GetLyncUserGeneralSettingsCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + base(exception, cancelled, userState) + { + this.results = results; + } + + /// + public LyncUser Result + { + get + { + this.RaiseExceptionIfNecessary(); + return ((LyncUser)(this.results[0])); + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + public delegate void SetLyncUserPlanCompletedEventHandler(object sender, SetLyncUserPlanCompletedEventArgs e); + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + public partial class SetLyncUserPlanCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs + { + + private object[] results; + + internal SetLyncUserPlanCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + base(exception, cancelled, userState) + { + this.results = results; + } + + /// + public bool Result + { + get + { + this.RaiseExceptionIfNecessary(); + return ((bool)(this.results[0])); + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + public delegate void DeleteUserCompletedEventHandler(object sender, DeleteUserCompletedEventArgs e); + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + public partial class DeleteUserCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs + { + + private object[] results; + + internal DeleteUserCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + base(exception, cancelled, userState) + { + this.results = results; + } + + /// + public bool Result + { + get + { + this.RaiseExceptionIfNecessary(); + return ((bool)(this.results[0])); + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + public delegate void GetFederationDomainsCompletedEventHandler(object sender, GetFederationDomainsCompletedEventArgs e); + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + public partial class GetFederationDomainsCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs + { + + private object[] results; + + internal GetFederationDomainsCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + base(exception, cancelled, userState) + { + this.results = results; + } + + /// + public LyncFederationDomain[] Result + { + get + { + this.RaiseExceptionIfNecessary(); + return ((LyncFederationDomain[])(this.results[0])); + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + public delegate void AddFederationDomainCompletedEventHandler(object sender, AddFederationDomainCompletedEventArgs e); + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + public partial class AddFederationDomainCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs + { + + private object[] results; + + internal AddFederationDomainCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + base(exception, cancelled, userState) + { + this.results = results; + } + + /// + public bool Result + { + get + { + this.RaiseExceptionIfNecessary(); + return ((bool)(this.results[0])); + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + public delegate void RemoveFederationDomainCompletedEventHandler(object sender, RemoveFederationDomainCompletedEventArgs e); + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + public partial class RemoveFederationDomainCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs + { + + private object[] results; + + internal RemoveFederationDomainCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + base(exception, cancelled, userState) + { + this.results = results; + } + + /// + public bool Result + { + get + { + this.RaiseExceptionIfNecessary(); + return ((bool)(this.results[0])); + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + public delegate void ReloadConfigurationCompletedEventHandler(object sender, System.ComponentModel.AsyncCompletedEventArgs e); +} diff --git a/WebsitePanel/Sources/WebsitePanel.Server.Client/WebsitePanel.Server.Client.csproj b/WebsitePanel/Sources/WebsitePanel.Server.Client/WebsitePanel.Server.Client.csproj index 0ac386bf..44b375f0 100644 --- a/WebsitePanel/Sources/WebsitePanel.Server.Client/WebsitePanel.Server.Client.csproj +++ b/WebsitePanel/Sources/WebsitePanel.Server.Client/WebsitePanel.Server.Client.csproj @@ -81,6 +81,7 @@ + diff --git a/WebsitePanel/Sources/WebsitePanel.Server/LyncServer.asmx b/WebsitePanel/Sources/WebsitePanel.Server/LyncServer.asmx new file mode 100644 index 00000000..8233e3df --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.Server/LyncServer.asmx @@ -0,0 +1 @@ +<%@ WebService Language="C#" CodeBehind="LyncServer.asmx.cs" Class="WebsitePanel.Server.LyncServer" %> diff --git a/WebsitePanel/Sources/WebsitePanel.Server/LyncServer.asmx.cs b/WebsitePanel/Sources/WebsitePanel.Server/LyncServer.asmx.cs new file mode 100644 index 00000000..8f04045d --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.Server/LyncServer.asmx.cs @@ -0,0 +1,236 @@ +// Copyright (c) 2012, Outercurve Foundation. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// - Redistributions of source code must retain the above copyright notice, this +// list of conditions and the following disclaimer. +// +// - Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// - Neither the name of the Outercurve Foundation nor the names of its +// contributors may be used to endorse or promote products derived from this +// software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +using System; +using System.ComponentModel; +using System.Web.Services; +using System.Web.Services.Protocols; +using WebsitePanel.Providers; +using WebsitePanel.Providers.HostedSolution; +using WebsitePanel.Server.Utils; +using Microsoft.Web.Services3; + +namespace WebsitePanel.Server +{ + /// + /// OCS Web Service + /// + [WebService(Namespace = "http://smbsaas/websitepanel/server/")] + [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] + [Policy("ServerPolicy")] + [ToolboxItem(false)] + public class LyncServer : HostingServiceProviderWebService + { + private ILyncServer Lync + { + get { return (ILyncServer)Provider; } + } + + + #region Organization + [WebMethod, SoapHeader("settings")] + public string CreateOrganization(string organizationId, string sipDomain, bool enableConferencing, bool enableConferencingVideo, int maxConferenceSize, bool enabledFederation, bool enabledEnterpriseVoice) + { + try + { + Log.WriteStart("{0}.CreateOrganization", ProviderSettings.ProviderName); + string ret = Lync.CreateOrganization(organizationId, sipDomain, enableConferencing, enableConferencingVideo, maxConferenceSize, enabledFederation, enabledEnterpriseVoice); + Log.WriteEnd("{0}.CreateOrganization", ProviderSettings.ProviderName); + return ret; + } + catch (Exception ex) + { + Log.WriteError(String.Format("Error: {0}.CreateOrganization", ProviderSettings.ProviderName), ex); + throw; + } + } + + [WebMethod, SoapHeader("settings")] + public bool DeleteOrganization(string organizationId, string sipDomain) + { + try + { + Log.WriteStart("{0}.DeleteOrganization", ProviderSettings.ProviderName); + bool ret = Lync.DeleteOrganization(organizationId, sipDomain); + Log.WriteEnd("{0}.DeleteOrganization", ProviderSettings.ProviderName); + return ret; + } + catch (Exception ex) + { + Log.WriteError(String.Format("Error: {0}.DeleteOrganization", ProviderSettings.ProviderName), ex); + throw; + } + } + #endregion + + #region Users + + [WebMethod, SoapHeader("settings")] + public bool CreateUser(string organizationId, string userUpn, LyncUserPlan plan) + { + try + { + Log.WriteStart("{0}.CreateUser", ProviderSettings.ProviderName); + bool ret = Lync.CreateUser(organizationId, userUpn, plan); + Log.WriteEnd("{0}.CreateUser", ProviderSettings.ProviderName); + return ret; + } + catch (Exception ex) + { + Log.WriteError(String.Format("Error: {0}.CreateUser", ProviderSettings.ProviderName), ex); + throw; + } + } + + [WebMethod, SoapHeader("settings")] + public LyncUser GetLyncUserGeneralSettings(string organizationId, string userUpn) + { + try + { + Log.WriteStart("{0}.GetLyncUserGeneralSettings", ProviderSettings.ProviderName); + LyncUser ret = Lync.GetLyncUserGeneralSettings(organizationId, userUpn); + Log.WriteEnd("{0}.GetLyncUserGeneralSettings", ProviderSettings.ProviderName); + return ret; + } + catch (Exception ex) + { + Log.WriteError(String.Format("Error: {0}.GetLyncUserGeneralSettings", ProviderSettings.ProviderName), ex); + throw; + } + } + + [WebMethod, SoapHeader("settings")] + public bool SetLyncUserPlan(string organizationId, string userUpn, LyncUserPlan plan) + { + try + { + Log.WriteStart("{0}.SetLyncUserPlan", ProviderSettings.ProviderName); + bool ret = Lync.SetLyncUserPlan(organizationId, userUpn, plan); + Log.WriteEnd("{0}.SetLyncUserPlan", ProviderSettings.ProviderName); + return ret; + } + catch (Exception ex) + { + Log.WriteError(String.Format("Error: {0}.SetLyncUserPlan", ProviderSettings.ProviderName), ex); + throw; + } + } + + [WebMethod, SoapHeader("settings")] + public bool DeleteUser(string userUpn) + { + try + { + Log.WriteStart("{0}.DeleteUser", ProviderSettings.ProviderName); + bool ret = Lync.DeleteUser(userUpn); + Log.WriteEnd("{0}.DeleteUser", ProviderSettings.ProviderName); + return ret; + } + catch (Exception ex) + { + Log.WriteError(String.Format("Error: {0}.DeleteUser", ProviderSettings.ProviderName), ex); + throw; + } + } + + #endregion + + #region Federation + [WebMethod, SoapHeader("settings")] + public LyncFederationDomain[] GetFederationDomains(string organizationId) + { + try + { + Log.WriteStart("{0}.GetFederationDomains", ProviderSettings.ProviderName); + LyncFederationDomain[] ret = Lync.GetFederationDomains(organizationId); + Log.WriteEnd("{0}.GetFederationDomains", ProviderSettings.ProviderName); + return ret; + } + catch (Exception ex) + { + Log.WriteError(String.Format("Error: {0}.GetFederationDomains", ProviderSettings.ProviderName), ex); + throw; + } + } + + [WebMethod, SoapHeader("settings")] + public bool AddFederationDomain(string organizationId, string domainName, string proxyFqdn) + { + try + { + Log.WriteStart("{0}.AddFederationDomain", ProviderSettings.ProviderName); + bool ret = Lync.AddFederationDomain(organizationId, domainName, proxyFqdn); + Log.WriteEnd("{0}.AddFederationDomain", ProviderSettings.ProviderName); + return ret; + } + catch (Exception ex) + { + Log.WriteError(String.Format("Error: {0}.AddFederationDomain", ProviderSettings.ProviderName), ex); + throw; + } + } + + [WebMethod, SoapHeader("settings")] + public bool RemoveFederationDomain(string organizationId, string domainName) + { + try + { + Log.WriteStart("{0}.RemoveFederationDomain", ProviderSettings.ProviderName); + bool ret = Lync.RemoveFederationDomain(organizationId, domainName); + Log.WriteEnd("{0}.RemoveFederationDomain", ProviderSettings.ProviderName); + return ret; + } + catch (Exception ex) + { + Log.WriteError(String.Format("Error: {0}.RemoveFederationDomain", ProviderSettings.ProviderName), ex); + throw; + } + } + #endregion + + [WebMethod, SoapHeader("settings")] + public void ReloadConfiguration() + { + try + { + Log.WriteStart("{0}.ReloadConfiguration", ProviderSettings.ProviderName); + Lync.ReloadConfiguration(); + Log.WriteEnd("{0}.ReloadConfiguration", ProviderSettings.ProviderName); + } + catch (Exception ex) + { + Log.WriteError(String.Format("Error: {0}.ReloadConfiguration", ProviderSettings.ProviderName), ex); + throw; + } + } + + + + + } +} diff --git a/WebsitePanel/Sources/WebsitePanel.Server/WebsitePanel.Server.csproj b/WebsitePanel/Sources/WebsitePanel.Server/WebsitePanel.Server.csproj index affbf40f..4ae2bf2d 100644 --- a/WebsitePanel/Sources/WebsitePanel.Server/WebsitePanel.Server.csproj +++ b/WebsitePanel/Sources/WebsitePanel.Server/WebsitePanel.Server.csproj @@ -68,6 +68,7 @@ + @@ -108,6 +109,10 @@ + + LyncServer.asmx + Component + OCSEdgeServer.asmx Component diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/App_Data/WebsitePanel_Modules.config b/WebsitePanel/Sources/WebsitePanel.WebPortal/App_Data/WebsitePanel_Modules.config index 76798152..e15f3f0a 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/App_Data/WebsitePanel_Modules.config +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/App_Data/WebsitePanel_Modules.config @@ -511,7 +511,15 @@ - + + + + + + + + + diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/App_GlobalResources/WebsitePanel_SharedResources.ascx.resx b/WebsitePanel/Sources/WebsitePanel.WebPortal/App_GlobalResources/WebsitePanel_SharedResources.ascx.resx index c04ed97a..d0195f36 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/App_GlobalResources/WebsitePanel_SharedResources.ascx.resx +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/App_GlobalResources/WebsitePanel_SharedResources.ascx.resx @@ -5005,4 +5005,133 @@ Consumer Organization Support + + Error deleting organization domain name. See audit log for more details. + + + Lync successfully enabled for this user + + + Cannot enable Lync User. The following errors have been occured: + + + Lync successfully added the federation domain + + + Cannot add federation domain. The following errors have been occured: + + + Lync successfully disabled for this user + + + Cannot delete Lync User, the following errors have been occured: + + + General Lync User settings have been successfully updated. + + + Error updating general Lync User settings. + + + Unable to add Lync user. + + + Unable to add Lync User to database. + + + Unable to check quota + + + Unable to delete Lync User. + + + Unable to delete Lync User from metadata. + + + Unable to get Lync proxy. + + + Unable to get user general settings. + + + Unable to set default settings. + + + Unable to get Lync Users. + + + Unable to get Lync Users count. + + + User first name is not specified. + + + Current user account is already enabled for Office Communications Server. + + + User last name is not specified. + + + Lync users quota has been reached. + + + Federation Allowed + + + Lync Users per Organization + + + Conferencing Allowed + + + Maximum participants per conference + + + Conference Video Allowed + + + Enterprise Voice Allowed + + + Enterprise Voice users + + + National Calls Allowed + + + Mobile Calls Allowed + + + International Calls Allowed + + + Lync Server + + + General Lync User settings have been successfully updated. + + + Lync User has been successfully created but the following errors have been occured: + + + Lync federation domain has been successfully created but the following errors have been occured: + + + Lync User has been successfully deleted but the following errors have been occured: + + + Error setting default organization lync user plan. See audit log for more details. + + + Add organization lync user plan + + + Delete plan + + + Unable to delete plan. Make sure the plan is not assigned to any user + + + Error creating organization plan. See audit log for more details. + \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/App_Themes/Default/Icons.skin b/WebsitePanel/Sources/WebsitePanel.WebPortal/App_Themes/Default/Icons.skin index 63089f09..5f9f29c4 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/App_Themes/Default/Icons.skin +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/App_Themes/Default/Icons.skin @@ -66,6 +66,13 @@ Default skin template. The following skins are provided as examples only. +<%-- Lync Icons --%> + + + + + + <%-- BlackBerry Icons --%> <%-- VPS Icons --%> diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/App_Themes/Default/Images/Exchange/lync16.png b/WebsitePanel/Sources/WebsitePanel.WebPortal/App_Themes/Default/Images/Exchange/lync16.png new file mode 100644 index 0000000000000000000000000000000000000000..e068fcbfa35c8f0dcebc83b026948cce91c510f5 GIT binary patch literal 602 zcmV-g0;TPx#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0q;pfK~y+TjZ!^p zR8bI}`>}bh#x1r>C&D&bSfmT-{U8t!D}RQFU?HT?1ws5F0U@0TRu-bIg+D0RSHrm6iowx2^LgeubC+|MEC6kI zQ~>Ya^_@gty*Qvz<8MS%?NXVi44c`>6`^=c0|dbvj8{cqF0soXLMV*TSxPwDl#qZa zS%P^=S+y5gVs`BnEfNss;Del=XT4=^dXQ4!v1$_Oi!4iVe|mS(D=B!l6``J$63Ygm z01XH#0CC+)=POU{qBh+nZj(W+DMigj3Cl$fStJz&AJo71=$$$n|Id%lZ+-d}>pDTl zV^UQR*paOX+Ee)pnIMrcoerF;$8D1*`qZl&Jb2LI3~&07*qoM6N<$g6lpCa{vGU literal 0 HcmV?d00001 diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/App_Themes/Default/Images/lync16.png b/WebsitePanel/Sources/WebsitePanel.WebPortal/App_Themes/Default/Images/lync16.png new file mode 100644 index 0000000000000000000000000000000000000000..e068fcbfa35c8f0dcebc83b026948cce91c510f5 GIT binary patch literal 602 zcmV-g0;TPx#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0q;pfK~y+TjZ!^p zR8bI}`>}bh#x1r>C&D&bSfmT-{U8t!D}RQFU?HT?1ws5F0U@0TRu-bIg+D0RSHrm6iowx2^LgeubC+|MEC6kI zQ~>Ya^_@gty*Qvz<8MS%?NXVi44c`>6`^=c0|dbvj8{cqF0soXLMV*TSxPwDl#qZa zS%P^=S+y5gVs`BnEfNss;Del=XT4=^dXQ4!v1$_Oi!4iVe|mS(D=B!l6``J$63Ygm z01XH#0CC+)=POU{qBh+nZj(W+DMigj3Cl$fStJz&AJo71=$$$n|Id%lZ+-d}>pDTl zV^UQR*paOX+Ee)pnIMrcoerF;$8D1*`qZl&Jb2LI3~&07*qoM6N<$g6lpCa{vGU literal 0 HcmV?d00001 diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/App_Themes/Default/Images/lync48.png b/WebsitePanel/Sources/WebsitePanel.WebPortal/App_Themes/Default/Images/lync48.png new file mode 100644 index 0000000000000000000000000000000000000000..3e31fe511f6a3b90ff9b0e71ef3ef48251b377ea GIT binary patch literal 6089 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 P00000NkvXXu0mjf9fGZY literal 0 HcmV?d00001 diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/App_Themes/Default/Images/lyncfederationdomains48.png b/WebsitePanel/Sources/WebsitePanel.WebPortal/App_Themes/Default/Images/lyncfederationdomains48.png new file mode 100644 index 0000000000000000000000000000000000000000..6eb49bc58de8c3a6c4a171fec96c1deb0cbcf416 GIT binary patch literal 7772 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 literal 0 HcmV?d00001 diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/App_Themes/Default/Images/lyncuserplanadd48.png b/WebsitePanel/Sources/WebsitePanel.WebPortal/App_Themes/Default/Images/lyncuserplanadd48.png new file mode 100644 index 0000000000000000000000000000000000000000..5e1af53e3c665d4cf98c8cda2181e2bf6243bd72 GIT binary patch literal 6037 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 Number of VM: + + BlackBerry Users: + + + Databases: + + + OCS Users: + + + Sharepoint Sites: + + + User Accounts: + + + Lync Users: + \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/Code/Framework/ES.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/Code/Framework/ES.cs index 845c52e4..aae6f6d5 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/Code/Framework/ES.cs +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/Code/Framework/ES.cs @@ -82,7 +82,14 @@ namespace WebsitePanel.Portal { get { return GetCachedProxy(); } } - + + + public esLync Lync + { + get { return GetCachedProxy(); } + } + + public esOrganizations Organizations { get diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/Code/Helpers/LyncHelper.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/Code/Helpers/LyncHelper.cs new file mode 100644 index 00000000..2724433e --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/Code/Helpers/LyncHelper.cs @@ -0,0 +1,85 @@ +// Copyright (c) 2012, Outercurve Foundation. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// - Redistributions of source code must retain the above copyright notice, this +// list of conditions and the following disclaimer. +// +// - Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// - Neither the name of the Outercurve Foundation nor the names of its +// contributors may be used to endorse or promote products derived from this +// software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +using System; +using WebsitePanel.Providers.HostedSolution; +using WebsitePanel.Providers.ResultObjects; + +namespace WebsitePanel.Portal +{ + public class LyncHelper + { + + public LyncUser[] GetLyncUsersPaged(int itemId, + string filterColumn, string filterValue, + int maximumRows, int startRowIndex, string sortColumn) + { + if (!String.IsNullOrEmpty(filterValue)) + filterValue = filterValue + "%"; + if (maximumRows == 0) + { + maximumRows = Int32.MaxValue; + } + + string name = string.Empty; + string email = string.Empty; + + if (filterColumn == "DisplayName") + name = filterValue; + else + email = filterValue; + + + string[] data = sortColumn.Split(' '); + string direction = data.Length > 1 ? "DESC" : "ASC"; + LyncUsersPagedResult res = + ES.Services.Lync.GetLyncUsersPaged(itemId, data[0], direction, startRowIndex, maximumRows); + + return res.Value.PageUsers; + } + + + public int GetLyncUsersPagedCount(int itemId, string filterColumn, string filterValue) + { + string name = string.Empty; + string email = string.Empty; + + if (!string.IsNullOrEmpty(filterValue)) + filterValue = filterValue + "%"; + + if (filterColumn == "DisplayName") + name = filterValue; + else + email = filterValue; + + IntResult res = ES.Services.Lync.GetLyncUserCount(itemId); + return res.Value; + } + + } +} diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/OrganizationHome.ascx.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/OrganizationHome.ascx.cs index 544d78cf..4334509c 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/OrganizationHome.ascx.cs +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/OrganizationHome.ascx.cs @@ -143,14 +143,13 @@ namespace WebsitePanel.Portal.ExchangeServer } else besStatsPanel.Visible = false; -/* + if (cntx.Groups.ContainsKey(ResourceGroups.Lync)) { lyncStatsPanel.Visible = true; BindLyncStats(); } else - */ lyncStatsPanel.Visible = false; diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/UserControls/App_LocalResources/Menu.ascx.resx b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/UserControls/App_LocalResources/Menu.ascx.resx index 91cf60e9..ea488c1d 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/UserControls/App_LocalResources/Menu.ascx.resx +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/UserControls/App_LocalResources/Menu.ascx.resx @@ -183,4 +183,16 @@ Mailbox Plans + + Lync + + + Lync User Plans + + + Lync Users + + + Lync Federation Domains + \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/UserControls/Menu.ascx.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/UserControls/Menu.ascx.cs index baa30d3a..dcb79f7e 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/UserControls/Menu.ascx.cs +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/UserControls/Menu.ascx.cs @@ -202,6 +202,21 @@ namespace WebsitePanel.Portal.ExchangeServer.UserControls groups.Add(ocsGroup); } + private void PrepareLyncMenu(PackageContext cntx, List groups, string imagePath) + { + MenuGroup lyncGroup = + new MenuGroup(GetLocalizedString("Text.LyncGroup"), imagePath + "lync16.png"); + lyncGroup.MenuItems.Add(CreateMenuItem("LyncUsers", "lync_users")); + + lyncGroup.MenuItems.Add(CreateMenuItem("LyncUserPlans", "lync_userplans")); + + + if (CheckQouta(Quotas.LYNC_FEDERATION, cntx)) + lyncGroup.MenuItems.Add(CreateMenuItem("LyncFederationDomains", "lync_federationdomains")); + + groups.Add(lyncGroup); + } + private List PrepareMenu() { PackageContext cntx = PackagesHelper.GetCachedPackageContext(PanelSecurity.PackageId); @@ -238,6 +253,9 @@ namespace WebsitePanel.Portal.ExchangeServer.UserControls if (cntx.Groups.ContainsKey(ResourceGroups.OCS)) PrepareOCSMenu(cntx, groups, imagePath); + //Lync Menu + if (cntx.Groups.ContainsKey(ResourceGroups.Lync)) + PrepareLyncMenu(cntx, groups, imagePath); return groups; } diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/Lync/App_LocalResources/LyncAddFederationDomain.ascx.resx b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/Lync/App_LocalResources/LyncAddFederationDomain.ascx.resx new file mode 100644 index 00000000..e777f6ab --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/Lync/App_LocalResources/LyncAddFederationDomain.ascx.resx @@ -0,0 +1,138 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Add Domain + + + Cancel + + + Please, enter correct domain name, for example "mydomain.com" or "sub.mydomain.com". + + + * + + + Please enter domain name + + + * + + \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/Lync/App_LocalResources/LyncAddLyncUserPlan.ascx.resx b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/Lync/App_LocalResources/LyncAddLyncUserPlan.ascx.resx new file mode 100644 index 00000000..daee76c2 --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/Lync/App_LocalResources/LyncAddLyncUserPlan.ascx.resx @@ -0,0 +1,183 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + <p> A plan is a template that defines the characteristics of a lync users </p> <p>The plan name needs to be unique. A plan cannot be modified. In case a user needs a plan with another characteristics, a new plan needs to be created and assigned to the user. A plan can only be deleted when the plan is not assigned to any users. </p> + + + Add Lync User Plan + + + Lync User Plan + + + Please enter correct plan + + + * + + + Instant Messaging + + + Conferencing + + + Enterprise Voice + + + Emergency Calls + + + National Calls + + + Plan Features + + + Lync User Plan + + + Federation + + + Conferencing Settings + + + Add New Plan + + + International Calls + + + Mobile Calls + + + None + + + Maximum Conference Size + + + Enterprise Voice Policy + + + Mobile Access + + \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/Lync/App_LocalResources/LyncCreateUser.ascx.resx b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/Lync/App_LocalResources/LyncCreateUser.ascx.resx new file mode 100644 index 00000000..fd626cd7 --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/Lync/App_LocalResources/LyncCreateUser.ascx.resx @@ -0,0 +1,138 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Create Lync User + + + Create + + + Select an existing Organization user and click the “Create” button to enable an individual user account for Microsoft Lync Server. + + + Display name* : + + + Create Lync User + + + Plan Name* : + + \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/Lync/App_LocalResources/LyncEditUser.ascx.resx b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/Lync/App_LocalResources/LyncEditUser.ascx.resx new file mode 100644 index 00000000..bad6c174 --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/Lync/App_LocalResources/LyncEditUser.ascx.resx @@ -0,0 +1,138 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Edit Lync User + + + Save changes + + + <p> A plan is a template that defines the capabilities of a lync user. In order to change the plan assigned to this user, select a plan and click the Save Changes button </p> + + + Display name: + + + Edit Lync User + + + Plan Name : + + \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/Lync/App_LocalResources/LyncFederationDomains.ascx.resx b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/Lync/App_LocalResources/LyncFederationDomains.ascx.resx new file mode 100644 index 00000000..e60864dd --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/Lync/App_LocalResources/LyncFederationDomains.ascx.resx @@ -0,0 +1,151 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Add New Domain + + + if(!confirm('Are you sure you want to delete selected federation domain?')) return false; else ShowProgressDialog('Deleting Federation Domain...'); + + + Delete + + + Delete Federation DOmain + + + No domains have been added yet. To add a new domain click "Add New Domain" button. + + + Domain Name + + + <p>By adding a federation domain you allow your users, that are enabled for federation, to interact through Lync with users from the specified domain. Your users as well as the users from the federated domain will see eachother status. </p> + +<p>Federation is a mutual agreement between you and your federation partner (owner of the domain you want to federate with). Once you have added the federation domain to your list, your partner will need to do the same from his side</p> + + + + + Lync Federation Domains + + + Lync Federation Domains + + \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/Lync/App_LocalResources/LyncUserPlans.ascx.resx b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/Lync/App_LocalResources/LyncUserPlans.ascx.resx new file mode 100644 index 00000000..536a1d01 --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/Lync/App_LocalResources/LyncUserPlans.ascx.resx @@ -0,0 +1,153 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Add New Plan + + + Set Default Plan + + + if(!confirm('Are you sure you want to delete selected plan?')) return false; else ShowProgressDialog('Deleting plan...'); + + + Delete + + + Delete Plan + + + No plans have been added yet. To add a new plan click "Add New Plan" button. + + + Default Plan + + + Plan + + + <p> A plan is a template that defines the capabilities of a lync users </p> <p>The plan name needs to be unique. A plan cannot be modified. In case a lync user needs a plan with another characteristics, a new plan needs to be created and assigned to the lync user. A plan can only be deleted when the plan is not assigned to any lync users. </p> + + + Lync User Plans + + + Lync User Plans + + \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/Lync/App_LocalResources/LyncUsers.ascx.resx b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/Lync/App_LocalResources/LyncUsers.ascx.resx new file mode 100644 index 00000000..9114e730 --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/Lync/App_LocalResources/LyncUsers.ascx.resx @@ -0,0 +1,155 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Lync Users + + + Create Lync User + + + Display name + + + Sign-in name + + + <p>Microsoft Lync Server delivers unified communications to the users, including software-powered VoIP, Web and audio/video conferencing, and enterprise instant messaging.</p> +<p>Click the “Create Lync User” button to enable a user account for Microsoft Lync Server. </p> +<p>If you delete an account in Microsoft Lync Server, the account is no longer available for use with Microsoft Lync Server unless you enable the account again. When you delete an account, all Lync Server settings for the account are lost, so you must configure the account again after enabling.</p> + + + Display name + + + Sign-in name + + + Lync Users + + + return confirm('Are you sure you want to delete Lync User?'); + + + Lync User Plan + + + No users have been Lync enabled. To enable a user for Lync click "Create Lync User" button. + + \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/Lync/LyncAddFederationDomain.ascx b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/Lync/LyncAddFederationDomain.ascx new file mode 100644 index 00000000..759710c9 --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/Lync/LyncAddFederationDomain.ascx @@ -0,0 +1,64 @@ +<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="LyncAddFederationDomain.ascx.cs" Inherits="WebsitePanel.Portal.LyncAddFederationDomain" %> +<%@ Register Src="../UserControls/EnableAsyncTasksSupport.ascx" TagName="EnableAsyncTasksSupport" TagPrefix="wsp" %> +<%@ Register Src="../ExchangeServer/UserControls/Menu.ascx" TagName="Menu" TagPrefix="wsp" %> +<%@ Register Src="../ExchangeServer/UserControls/Breadcrumb.ascx" TagName="Breadcrumb" TagPrefix="wsp" %> +<%@ Register Src="../UserControls/SimpleMessageBox.ascx" TagName="SimpleMessageBox" TagPrefix="wsp" %> + + + +
    +
    +
    + +
    +
    + +
    +
    +
    +
    + + +
    +
    + + + + + + + + + + +
    + + + + + +
    + + + + +
    +
    +
    + + + +
    +
    +
    +
    + +
    +
    +
    +
    \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/Lync/LyncAddFederationDomain.ascx.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/Lync/LyncAddFederationDomain.ascx.cs new file mode 100644 index 00000000..642cf496 --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/Lync/LyncAddFederationDomain.ascx.cs @@ -0,0 +1,82 @@ +// Copyright (c) 2011, Outercurve Foundation. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// - Redistributions of source code must retain the above copyright notice, this +// list of conditions and the following disclaimer. +// +// - Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// - Neither the name of the Outercurve Foundation nor the names of its +// contributors may be used to endorse or promote products derived from this +// software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +using System; +using WebsitePanel.Providers.ResultObjects; +using WebsitePanel.EnterpriseServer; + +namespace WebsitePanel.Portal +{ + public partial class LyncAddFederationDomain : WebsitePanelModuleBase + { + protected void Page_Load(object sender, EventArgs e) + { + ProxyFQDN.Visible = ProxyFQDN.Enabled = false; + locProxyFQDN.Visible = false; + } + + private void AddDomain() + { + if (!Page.IsValid) + return; + + + // get domain name + string domainName = DomainName.Text.Trim(); + string proxyFQDN = ProxyFQDN.Text.Trim(); + + + LyncUserResult res = ES.Services.Lync.AddFederationDomain(PanelRequest.ItemID, domainName, proxyFQDN); + if (!(res.IsSuccess && res.ErrorCodes.Count == 0)) + { + messageBox.ShowMessage(res, "ADD_LYNC_FEDERATIONDOMAIN", "LYNC"); + } + + + // return + RedirectBack(); + } + + private void RedirectBack() + { + Response.Redirect(EditUrl("ItemID", PanelRequest.ItemID.ToString(), "lync_federationdomains", + "SpaceID=" + PanelSecurity.PackageId)); + + } + + protected void btnCancel_Click(object sender, EventArgs e) + { + // return + RedirectBack(); + } + protected void btnAdd_Click(object sender, EventArgs e) + { + AddDomain(); + } + } +} \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/Lync/LyncAddFederationDomain.ascx.designer.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/Lync/LyncAddFederationDomain.ascx.designer.cs new file mode 100644 index 00000000..f244efeb --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/Lync/LyncAddFederationDomain.ascx.designer.cs @@ -0,0 +1,177 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace WebsitePanel.Portal { + + + public partial class LyncAddFederationDomain { + + /// + /// asyncTasks control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.EnableAsyncTasksSupport asyncTasks; + + /// + /// breadcrumb control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.ExchangeServer.UserControls.Breadcrumb breadcrumb; + + /// + /// menu control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.ExchangeServer.UserControls.Menu menu; + + /// + /// Image1 control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Image Image1; + + /// + /// locTitle control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Localize locTitle; + + /// + /// messageBox control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.UserControls.SimpleMessageBox messageBox; + + /// + /// AddFederationDomain control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.HtmlControls.HtmlTable AddFederationDomain; + + /// + /// locDomainName control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Localize locDomainName; + + /// + /// DomainName control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.TextBox DomainName; + + /// + /// DomainRequiredValidator control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.RequiredFieldValidator DomainRequiredValidator; + + /// + /// DomainFormatValidator control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.RegularExpressionValidator DomainFormatValidator; + + /// + /// locProxyFQDN control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Localize locProxyFQDN; + + /// + /// ProxyFQDN control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.TextBox ProxyFQDN; + + /// + /// ProxyFqdnFormatValidator control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.RegularExpressionValidator ProxyFqdnFormatValidator; + + /// + /// btnAdd control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Button btnAdd; + + /// + /// btnCancel control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Button btnCancel; + + /// + /// ValidationSummary1 control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.ValidationSummary ValidationSummary1; + + /// + /// FormComments control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Localize FormComments; + } +} diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/Lync/LyncAddLyncUserPlan.ascx b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/Lync/LyncAddLyncUserPlan.ascx new file mode 100644 index 00000000..d8c55723 --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/Lync/LyncAddLyncUserPlan.ascx @@ -0,0 +1,132 @@ +<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="LyncAddLyncUserPlan.ascx.cs" Inherits="WebsitePanel.Portal.Lync.LyncAddLyncUserPlan" %> +<%@ Register Src="../UserControls/SimpleMessageBox.ascx" TagName="SimpleMessageBox" TagPrefix="wsp" %> +<%@ Register Src="../ExchangeServer/UserControls/Menu.ascx" TagName="Menu" TagPrefix="wsp" %> +<%@ Register Src="../ExchangeServer/UserControls/Breadcrumb.ascx" TagName="Breadcrumb" TagPrefix="wsp" %> +<%@ Register Src="../ExchangeServer/UserControls/SizeBox.ascx" TagName="SizeBox" TagPrefix="wsp" %> +<%@ Register Src="../ExchangeServer/UserControls/DaysBox.ascx" TagName="DaysBox" TagPrefix="wsp" %> +<%@ Register Src="../UserControls/CollapsiblePanel.ascx" TagName="CollapsiblePanel" TagPrefix="wsp" %> +<%@ Register Src="../UserControls/EnableAsyncTasksSupport.ascx" TagName="EnableAsyncTasksSupport" TagPrefix="wsp" %> + + + +
    +
    +
    + +
    +
    + +
    +
    +
    +
    + + +
    +
    + + + + + + + + + + +
    + + + + +
    +
    +
    + + + + + + + + + + + + + + + + + + + + +
    + +
    + +
    + +
    + +
    + +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + +
    + +
    + +
    + +
    +
    +
    + + +
    +
    + + +
    +
    +
    +
    + +
    +
    +
    +
    \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/Lync/LyncAddLyncUserPlan.ascx.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/Lync/LyncAddLyncUserPlan.ascx.cs new file mode 100644 index 00000000..64b99076 --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/Lync/LyncAddLyncUserPlan.ascx.cs @@ -0,0 +1,157 @@ +// Copyright (c) 2011, Outercurve Foundation. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// - Redistributions of source code must retain the above copyright notice, this +// list of conditions and the following disclaimer. +// +// - Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// - Neither the name of the Outercurve Foundation nor the names of its +// contributors may be used to endorse or promote products derived from this +// software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +using System; +using WebsitePanel.EnterpriseServer; +using WebsitePanel.Providers.HostedSolution; +using WebsitePanel.Providers.ResultObjects; + +namespace WebsitePanel.Portal.Lync +{ + public partial class LyncAddLyncUserPlan : WebsitePanelModuleBase + { + protected void Page_Load(object sender, EventArgs e) + { + + if (!IsPostBack) + { + if (PanelRequest.GetInt("LyncUserPlanId") != 0) + { + Providers.HostedSolution.LyncUserPlan plan = ES.Services.Lync.GetLyncUserPlan(PanelRequest.ItemID, PanelRequest.GetInt("LyncUserPlanId")); + + txtPlan.Text = plan.LyncUserPlanName; + chkIM.Checked = plan.IM; + chkIM.Enabled = false; + chkFederation.Checked = plan.Federation; + chkConferencing.Checked = plan.Conferencing; + chkMobility.Checked = plan.Mobility; + chkEnterpriseVoice.Checked = plan.EnterpriseVoice; + switch (plan.VoicePolicy) + { + case LyncVoicePolicyType.None: + break; + case LyncVoicePolicyType.Emergency: + chkEmergency.Checked = true; + break; + case LyncVoicePolicyType.National: + chkNational.Checked = true; + break; + case LyncVoicePolicyType.Mobile: + chkMobile.Checked = true; + break; + case LyncVoicePolicyType.International: + chkInternational.Checked = true; + break; + default: + chkNone.Checked = true; + break; + } + + locTitle.Text = plan.LyncUserPlanName; + this.DisableControls = true; + + } + else + { + chkIM.Checked = true; + chkIM.Enabled = false; + chkNone.Checked = true; + PackageContext cntx = ES.Services.Packages.GetPackageContext(PanelSecurity.PackageId); + if (cntx != null) + { + foreach (QuotaValueInfo quota in cntx.QuotasArray) + { + switch (quota.QuotaId) + { + case 371: + chkFederation.Checked = Convert.ToBoolean(quota.QuotaAllocatedValue); + chkFederation.Enabled = Convert.ToBoolean(quota.QuotaAllocatedValue); + break; + case 372: + chkConferencing.Checked = Convert.ToBoolean(quota.QuotaAllocatedValue); + chkConferencing.Enabled = Convert.ToBoolean(quota.QuotaAllocatedValue); + break; + case 375: + chkEnterpriseVoice.Checked = Convert.ToBoolean(quota.QuotaAllocatedValue); + chkEnterpriseVoice.Enabled = Convert.ToBoolean(quota.QuotaAllocatedValue); + break; + } + } + } + else + this.DisableControls = true; + } + } + + } + + protected void btnAdd_Click(object sender, EventArgs e) + { + AddPlan(); + } + + private void AddPlan() + { + try + { + Providers.HostedSolution.LyncUserPlan plan = new Providers.HostedSolution.LyncUserPlan(); + plan.LyncUserPlanName = txtPlan.Text; + plan.IsDefault = false; + + plan.IM = true; + plan.Mobility = chkMobility.Checked; + plan.Federation = chkFederation.Checked; + plan.Conferencing = chkConferencing.Checked; + + + plan.EnterpriseVoice = chkEnterpriseVoice.Checked; + if (!plan.EnterpriseVoice) + { + plan.VoicePolicy = LyncVoicePolicyType.None; + } + + int result = ES.Services.Lync.AddLyncUserPlan( PanelRequest.ItemID, + plan); + + + if (result < 0) + { + messageBox.ShowResultMessage(result); + return; + } + + Response.Redirect(EditUrl("ItemID", PanelRequest.ItemID.ToString(), "lync_userplans", + "SpaceID=" + PanelSecurity.PackageId)); + } + catch (Exception ex) + { + messageBox.ShowErrorMessage("LYNC_ADD_PLAN", ex); + } + } + } +} \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/Lync/LyncAddLyncUserPlan.ascx.designer.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/Lync/LyncAddLyncUserPlan.ascx.designer.cs new file mode 100644 index 00000000..6ad8557f --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/Lync/LyncAddLyncUserPlan.ascx.designer.cs @@ -0,0 +1,258 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace WebsitePanel.Portal.Lync { + + + public partial class LyncAddLyncUserPlan { + + /// + /// asyncTasks control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.EnableAsyncTasksSupport asyncTasks; + + /// + /// breadcrumb control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.ExchangeServer.UserControls.Breadcrumb breadcrumb; + + /// + /// menu control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.ExchangeServer.UserControls.Menu menu; + + /// + /// Image1 control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Image Image1; + + /// + /// locTitle control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Localize locTitle; + + /// + /// messageBox control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.UserControls.SimpleMessageBox messageBox; + + /// + /// secPlan control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.CollapsiblePanel secPlan; + + /// + /// Plan control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Panel Plan; + + /// + /// txtPlan control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.TextBox txtPlan; + + /// + /// valRequirePlan control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.RequiredFieldValidator valRequirePlan; + + /// + /// secPlanFeatures control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.CollapsiblePanel secPlanFeatures; + + /// + /// PlanFeatures control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Panel PlanFeatures; + + /// + /// chkIM control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.CheckBox chkIM; + + /// + /// chkMobility control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.CheckBox chkMobility; + + /// + /// chkFederation control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.CheckBox chkFederation; + + /// + /// chkConferencing control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.CheckBox chkConferencing; + + /// + /// chkEnterpriseVoice control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.CheckBox chkEnterpriseVoice; + + /// + /// secEnterpriseVoice control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.CollapsiblePanel secEnterpriseVoice; + + /// + /// EnterpriseVoice control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Panel EnterpriseVoice; + + /// + /// chkNone control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.RadioButton chkNone; + + /// + /// chkEmergency control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.RadioButton chkEmergency; + + /// + /// chkNational control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.RadioButton chkNational; + + /// + /// chkMobile control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.RadioButton chkMobile; + + /// + /// chkInternational control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.RadioButton chkInternational; + + /// + /// btnAdd control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Button btnAdd; + + /// + /// ValidationSummary1 control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.ValidationSummary ValidationSummary1; + + /// + /// FormComments control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Localize FormComments; + } +} diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/Lync/LyncCreateUser.ascx b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/Lync/LyncCreateUser.ascx new file mode 100644 index 00000000..93d2389d --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/Lync/LyncCreateUser.ascx @@ -0,0 +1,62 @@ +<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="LyncCreateUser.ascx.cs" Inherits="WebsitePanel.Portal.Lync.CreateLyncUser" %> +<%@ Register Src="../ExchangeServer/UserControls/UserSelector.ascx" TagName="UserSelector" TagPrefix="wsp" %> +<%@ Register Src="../ExchangeServer/UserControls/Menu.ascx" TagName="Menu" TagPrefix="wsp" %> +<%@ Register Src="../ExchangeServer/UserControls/Breadcrumb.ascx" TagName="Breadcrumb" TagPrefix="wsp" %> +<%@ Register Src="../UserControls/SimpleMessageBox.ascx" TagName="SimpleMessageBox" TagPrefix="wsp" %> +<%@ Register Src="../UserControls/EnableAsyncTasksSupport.ascx" TagName="EnableAsyncTasksSupport" TagPrefix="wsp" %> +<%@ Register Src="../UserControls/QuotaViewer.ascx" TagName="QuotaViewer" TagPrefix="wsp" %> +<%@ Register Src="UserControls/LyncUserPlanSelector.ascx" TagName="LyncUserPlanSelector" TagPrefix="wsp" %> + + +
    +
    +
    + +
    +
    + +
    +
    +
    +
    + + +
    +
    + + + + + + + +
    + +
    + + + + + + +
    + + + +
    + + +
    + +
    +
    +
    +
    + +
    +
    +
    +
    + diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/Lync/LyncCreateUser.ascx.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/Lync/LyncCreateUser.ascx.cs new file mode 100644 index 00000000..eabe3e15 --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/Lync/LyncCreateUser.ascx.cs @@ -0,0 +1,66 @@ +// Copyright (c) 2011, Outercurve Foundation. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// - Redistributions of source code must retain the above copyright notice, this +// list of conditions and the following disclaimer. +// +// - Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// - Neither the name of the Outercurve Foundation nor the names of its +// contributors may be used to endorse or promote products derived from this +// software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +using System; +using WebsitePanel.Providers.ResultObjects; +using WebsitePanel.EnterpriseServer; + +namespace WebsitePanel.Portal.Lync +{ + public partial class CreateLyncUser : WebsitePanelModuleBase + { + protected void Page_Load(object sender, EventArgs e) + { + if (!IsPostBack) + { + WebsitePanel.Providers.HostedSolution.LyncUserPlan[] plans = ES.Services.Lync.GetLyncUserPlans(PanelRequest.ItemID); + + if (plans.Length == 0) + btnCreate.Enabled = false; + } + + + } + + protected void btnCreate_Click(object sender, EventArgs e) + { + int accountId = userSelector.GetAccountId(); + LyncUserResult res = ES.Services.Lync.CreateLyncUser(PanelRequest.ItemID, accountId, Convert.ToInt32(planSelector.planId)); + if (res.IsSuccess && res.ErrorCodes.Count == 0) + { + Response.Redirect(EditUrl("AccountID", accountId.ToString(), "edit_lync_user", + "SpaceID=" + PanelSecurity.PackageId, + "ItemID=" + PanelRequest.ItemID)); + } + else + { + messageBox.ShowMessage(res, "CREATE_LYNC_USER", "LYNC"); + } + } + } +} \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/Lync/LyncCreateUser.ascx.designer.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/Lync/LyncCreateUser.ascx.designer.cs new file mode 100644 index 00000000..4b7232df --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/Lync/LyncCreateUser.ascx.designer.cs @@ -0,0 +1,132 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace WebsitePanel.Portal.Lync { + + + public partial class CreateLyncUser { + + /// + /// asyncTasks control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.EnableAsyncTasksSupport asyncTasks; + + /// + /// breadcrumb control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.ExchangeServer.UserControls.Breadcrumb breadcrumb; + + /// + /// menu control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.ExchangeServer.UserControls.Menu menu; + + /// + /// Image1 control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Image Image1; + + /// + /// locTitle control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Localize locTitle; + + /// + /// messageBox control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.UserControls.SimpleMessageBox messageBox; + + /// + /// ExistingUserTable control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.HtmlControls.HtmlTable ExistingUserTable; + + /// + /// Localize1 control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Localize Localize1; + + /// + /// userSelector control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.ExchangeServer.UserControls.UserSelector userSelector; + + /// + /// locPlanName control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Localize locPlanName; + + /// + /// planSelector control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.Lync.UserControls.LyncUserPlanSelector planSelector; + + /// + /// btnCreate control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Button btnCreate; + + /// + /// FormComments control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Localize FormComments; + } +} diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/Lync/LyncEditUser.ascx b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/Lync/LyncEditUser.ascx new file mode 100644 index 00000000..b1017e85 --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/Lync/LyncEditUser.ascx @@ -0,0 +1,54 @@ +<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="LyncEditUser.ascx.cs" Inherits="WebsitePanel.Portal.Lync.EditLyncUser" %> +<%@ Register Src="../ExchangeServer/UserControls/UserSelector.ascx" TagName="UserSelector" TagPrefix="wsp" %> +<%@ Register Src="../ExchangeServer/UserControls/Menu.ascx" TagName="Menu" TagPrefix="wsp" %> +<%@ Register Src="../ExchangeServer/UserControls/Breadcrumb.ascx" TagName="Breadcrumb" TagPrefix="wsp" %> +<%@ Register Src="../UserControls/SimpleMessageBox.ascx" TagName="SimpleMessageBox" TagPrefix="wsp" %> +<%@ Register Src="../UserControls/EnableAsyncTasksSupport.ascx" TagName="EnableAsyncTasksSupport" TagPrefix="wsp" %> +<%@ Register Src="../UserControls/QuotaViewer.ascx" TagName="QuotaViewer" TagPrefix="wsp" %> +<%@ Register src="../ExchangeServer/UserControls/MailboxSelector.ascx" tagname="MailboxSelector" tagprefix="uc1" %> +<%@ Register Src="UserControls/LyncUserPlanSelector.ascx" TagName="LyncUserPlanSelector" TagPrefix="wsp" %> + + +
    +
    +
    + +
    +
    + +
    +
    +
    +
    + + + - + +
    +
    + + + + + + + + +
    + + + +
    + +
    + +
    +
    +
    +
    + +
    +
    +
    +
    diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/Lync/LyncEditUser.ascx.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/Lync/LyncEditUser.ascx.cs new file mode 100644 index 00000000..aa3b96fa --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/Lync/LyncEditUser.ascx.cs @@ -0,0 +1,76 @@ +// Copyright (c) 2011, Outercurve Foundation. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// - Redistributions of source code must retain the above copyright notice, this +// list of conditions and the following disclaimer. +// +// - Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// - Neither the name of the Outercurve Foundation nor the names of its +// contributors may be used to endorse or promote products derived from this +// software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +using System; +using WebsitePanel.EnterpriseServer; +using WebsitePanel.Providers.ResultObjects; +using WebsitePanel.Providers.HostedSolution; + +namespace WebsitePanel.Portal.Lync +{ + public partial class EditLyncUser : WebsitePanelModuleBase + { + + protected void Page_Load(object sender, EventArgs e) + { + if (!IsPostBack) + BindItems(); + + } + + private void BindItems() + { + // get settings + LyncUser lyncUser = ES.Services.Lync.GetLyncUserGeneralSettings(PanelRequest.ItemID, PanelRequest.AccountID); + + // title + litDisplayName.Text = lyncUser.DisplayName; + + planSelector.planId = lyncUser.LyncUserPlanId.ToString(); + } + + protected void btnSave_Click(object sender, EventArgs e) + { + if (!Page.IsValid) + return; + try + { + LyncUserResult res = ES.Services.Lync.SetUserLyncPlan(PanelRequest.ItemID, PanelRequest.AccountID, Convert.ToInt32(planSelector.planId)); + if (res.IsSuccess && res.ErrorCodes.Count == 0) + { + messageBox.ShowSuccessMessage("UPDATE_LYNC_USER"); + return; + } + } + catch(Exception ex) + { + messageBox.ShowErrorMessage("UPDATE_LYNC_USER", ex); + } + } + } +} \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/Lync/LyncEditUser.ascx.designer.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/Lync/LyncEditUser.ascx.designer.cs new file mode 100644 index 00000000..4d44e037 --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/Lync/LyncEditUser.ascx.designer.cs @@ -0,0 +1,114 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace WebsitePanel.Portal.Lync { + + + public partial class EditLyncUser { + + /// + /// asyncTasks control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.EnableAsyncTasksSupport asyncTasks; + + /// + /// breadcrumb control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.ExchangeServer.UserControls.Breadcrumb breadcrumb; + + /// + /// menu control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.ExchangeServer.UserControls.Menu menu; + + /// + /// Image1 control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Image Image1; + + /// + /// locTitle control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Localize locTitle; + + /// + /// litDisplayName control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Literal litDisplayName; + + /// + /// messageBox control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.UserControls.SimpleMessageBox messageBox; + + /// + /// locPlanName control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Localize locPlanName; + + /// + /// planSelector control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.Lync.UserControls.LyncUserPlanSelector planSelector; + + /// + /// btnSave control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Button btnSave; + + /// + /// FormComments control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Localize FormComments; + } +} diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/Lync/LyncFederationDomains.ascx b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/Lync/LyncFederationDomains.ascx new file mode 100644 index 00000000..df871012 --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/Lync/LyncFederationDomains.ascx @@ -0,0 +1,63 @@ +<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="LyncFederationDomains.ascx.cs" Inherits="WebsitePanel.Portal.Lync.LyncFederationDomains" %> +<%@ Register Src="../UserControls/SimpleMessageBox.ascx" TagName="SimpleMessageBox" TagPrefix="wsp" %> +<%@ Register Src="../ExchangeServer/UserControls/Menu.ascx" TagName="Menu" TagPrefix="wsp" %> +<%@ Register Src="../ExchangeServer/UserControls/Breadcrumb.ascx" TagName="Breadcrumb" TagPrefix="wsp" %> +<%@ Register Src="../UserControls/QuotaViewer.ascx" TagName="QuotaViewer" TagPrefix="wsp" %> +<%@ Register Src="../UserControls/EnableAsyncTasksSupport.ascx" TagName="EnableAsyncTasksSupport" TagPrefix="wsp" %> + + + +
    +
    +
    + +
    +
    + +
    +
    +
    +
    + + +
    +
    + + +
    + +
    + + + + + + + + <%# Eval("DomainName") %> + + + + + +   + + + + +
    + +
    + +
    +
    +
    + +
    +
    +
    +
    \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/Lync/LyncFederationDomains.ascx.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/Lync/LyncFederationDomains.ascx.cs new file mode 100644 index 00000000..9a74216a --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/Lync/LyncFederationDomains.ascx.cs @@ -0,0 +1,87 @@ +// Copyright (c) 2011, Outercurve Foundation. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// - Redistributions of source code must retain the above copyright notice, this +// list of conditions and the following disclaimer. +// +// - Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// - Neither the name of the Outercurve Foundation nor the names of its +// contributors may be used to endorse or promote products derived from this +// software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +using System; +using System.Web.UI.WebControls; +using WebsitePanel.EnterpriseServer; +using WebsitePanel.Providers.ResultObjects; +using WebsitePanel.Providers.HostedSolution; + +namespace WebsitePanel.Portal.Lync +{ + public partial class LyncFederationDomains : WebsitePanelModuleBase + { + protected void Page_Load(object sender, EventArgs e) + { + if (!IsPostBack) + { + // bind domain names + BindDomainNames(); + } + + } + + private void BindDomainNames() + { + LyncFederationDomain[] list = ES.Services.Lync.GetFederationDomains(PanelRequest.ItemID); + + gvDomains.DataSource = list; + gvDomains.DataBind(); + + } + + protected void btnAddDomain_Click(object sender, EventArgs e) + { + Response.Redirect(EditUrl("ItemID", PanelRequest.ItemID.ToString(), "add_lyncfederation_domain", + "SpaceID=" + PanelSecurity.PackageId)); + } + + protected void gvDomains_RowCommand(object sender, GridViewCommandEventArgs e) + { + if (e.CommandName == "DeleteItem") + { + try + { + LyncUserResult res = ES.Services.Lync.RemoveFederationDomain(PanelRequest.ItemID, e.CommandArgument.ToString()); + if (!(res.IsSuccess && res.ErrorCodes.Count == 0)) + { + messageBox.ShowMessage(res, "DELETE_LYNC_FEDERATIONDOMAIN", "LYNC"); + return; + } + + // rebind domains + BindDomainNames(); + } + catch (Exception ex) + { + ShowErrorMessage("LYNC_DELETE_DOMAIN", ex); + } + } + } + } +} \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/Lync/LyncFederationDomains.ascx.designer.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/Lync/LyncFederationDomains.ascx.designer.cs new file mode 100644 index 00000000..8492606b --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/Lync/LyncFederationDomains.ascx.designer.cs @@ -0,0 +1,96 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace WebsitePanel.Portal.Lync { + + + public partial class LyncFederationDomains { + + /// + /// asyncTasks control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.EnableAsyncTasksSupport asyncTasks; + + /// + /// breadcrumb control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.ExchangeServer.UserControls.Breadcrumb breadcrumb; + + /// + /// menu control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.ExchangeServer.UserControls.Menu menu; + + /// + /// Image1 control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Image Image1; + + /// + /// locTitle control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Localize locTitle; + + /// + /// messageBox control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.UserControls.SimpleMessageBox messageBox; + + /// + /// btnAddDomain control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Button btnAddDomain; + + /// + /// gvDomains control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.GridView gvDomains; + + /// + /// FormComments control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Localize FormComments; + } +} diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/Lync/LyncUserPlans.ascx b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/Lync/LyncUserPlans.ascx new file mode 100644 index 00000000..e91be256 --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/Lync/LyncUserPlans.ascx @@ -0,0 +1,73 @@ +<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="LyncUserPlans.ascx.cs" Inherits="WebsitePanel.Portal.Lync.LyncUserPlans" %> +<%@ Register Src="../UserControls/SimpleMessageBox.ascx" TagName="SimpleMessageBox" TagPrefix="wsp" %> +<%@ Register Src="../ExchangeServer/UserControls/Menu.ascx" TagName="Menu" TagPrefix="wsp" %> +<%@ Register Src="../ExchangeServer/UserControls/Breadcrumb.ascx" TagName="Breadcrumb" TagPrefix="wsp" %> +<%@ Register Src="../UserControls/QuotaViewer.ascx" TagName="QuotaViewer" TagPrefix="wsp" %> +<%@ Register Src="../UserControls/EnableAsyncTasksSupport.ascx" TagName="EnableAsyncTasksSupport" TagPrefix="wsp" %> + + + +
    +
    +
    + +
    +
    + +
    +
    +
    +
    + + +
    +
    + + +
    + +
    + + + + + + + + <%# Eval("LyncUserPlanName")%> + + + + + +
    + /> +
    +
    +
    + + +   + + +
    +
    +
    +
    + +
    + +
    +
    +
    + +
    +
    +
    +
    \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/Lync/LyncUserPlans.ascx.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/Lync/LyncUserPlans.ascx.cs new file mode 100644 index 00000000..3137598d --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/Lync/LyncUserPlans.ascx.cs @@ -0,0 +1,125 @@ +// Copyright (c) 2011, Outercurve Foundation. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// - Redistributions of source code must retain the above copyright notice, this +// list of conditions and the following disclaimer. +// +// - Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// - Neither the name of the Outercurve Foundation nor the names of its +// contributors may be used to endorse or promote products derived from this +// software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +using System; +using System.Web.UI.WebControls; +using WebsitePanel.EnterpriseServer; +using WebsitePanel.Providers.HostedSolution; + +namespace WebsitePanel.Portal.Lync +{ + public partial class LyncUserPlans : WebsitePanelModuleBase + { + protected void Page_Load(object sender, EventArgs e) + { + if (!IsPostBack) + { + BindPlans(); + } + + } + + public string GetPlanDisplayUrl(string LyncUserPlanId) + { + return EditUrl("SpaceID", PanelSecurity.PackageId.ToString(), "add_lyncuserplan", + "LyncUserPlanId=" + LyncUserPlanId, + "ItemID=" + PanelRequest.ItemID); + } + + + private void BindPlans() + { + LyncUserPlan[] list = ES.Services.Lync.GetLyncUserPlans(PanelRequest.ItemID); + + gvPlans.DataSource = list; + gvPlans.DataBind(); + + //check if organization has only one default domain + if (gvPlans.Rows.Count == 1) + { + btnSetDefaultPlan.Enabled = false; + } + } + + public string IsChecked(bool val) + { + return val ? "checked" : ""; + } + + protected void btnAddPlan_Click(object sender, EventArgs e) + { + btnSetDefaultPlan.Enabled = true; + Response.Redirect(EditUrl("ItemID", PanelRequest.ItemID.ToString(), "add_lyncuserplan", + "SpaceID=" + PanelSecurity.PackageId)); + } + + protected void gvPlan_RowCommand(object sender, GridViewCommandEventArgs e) + { + if (e.CommandName == "DeleteItem") + { + int planId = Utils.ParseInt(e.CommandArgument.ToString(), 0); + + try + { + int result = ES.Services.Lync.DeleteLyncUserPlan(PanelRequest.ItemID, planId); + + if (result < 0) + { + messageBox.ShowResultMessage(result); + return; + } + + } + catch (Exception) + { + messageBox.ShowErrorMessage("LYNC_DELETE_PLAN"); + } + + BindPlans(); + } + } + + protected void btnSetDefaultPlan_Click(object sender, EventArgs e) + { + // get domain + int planId = Utils.ParseInt(Request.Form["DefaultPlan"], 0); + + try + { + ES.Services.Lync.SetOrganizationDefaultLyncUserPlan(PanelRequest.ItemID, planId); + + // rebind domains + BindPlans(); + } + catch (Exception ex) + { + ShowErrorMessage("LYNC_SET_DEFAULT_PLAN", ex); + } + } + } +} \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/Lync/LyncUserPlans.ascx.designer.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/Lync/LyncUserPlans.ascx.designer.cs new file mode 100644 index 00000000..7cde581a --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/Lync/LyncUserPlans.ascx.designer.cs @@ -0,0 +1,105 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace WebsitePanel.Portal.Lync { + + + public partial class LyncUserPlans { + + /// + /// asyncTasks control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.EnableAsyncTasksSupport asyncTasks; + + /// + /// breadcrumb control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.ExchangeServer.UserControls.Breadcrumb breadcrumb; + + /// + /// menu control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.ExchangeServer.UserControls.Menu menu; + + /// + /// Image1 control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Image Image1; + + /// + /// locTitle control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Localize locTitle; + + /// + /// messageBox control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.UserControls.SimpleMessageBox messageBox; + + /// + /// btnAddPlan control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Button btnAddPlan; + + /// + /// gvPlans control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.GridView gvPlans; + + /// + /// btnSetDefaultPlan control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Button btnSetDefaultPlan; + + /// + /// FormComments control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Localize FormComments; + } +} diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/Lync/LyncUsers.ascx b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/Lync/LyncUsers.ascx new file mode 100644 index 00000000..0fe66529 --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/Lync/LyncUsers.ascx @@ -0,0 +1,91 @@ +<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="LyncUsers.ascx.cs" Inherits="WebsitePanel.Portal.Lync.LyncUsers" %> +<%@ Register Src="../ExchangeServer/UserControls/UserSelector.ascx" TagName="UserSelector" TagPrefix="wsp" %> +<%@ Register Src="../ExchangeServer/UserControls/Menu.ascx" TagName="Menu" TagPrefix="wsp" %> +<%@ Register Src="../ExchangeServer/UserControls/Breadcrumb.ascx" TagName="Breadcrumb" TagPrefix="wsp" %> +<%@ Register Src="../UserControls/SimpleMessageBox.ascx" TagName="SimpleMessageBox" TagPrefix="wsp" %> +<%@ Register Src="../UserControls/EnableAsyncTasksSupport.ascx" TagName="EnableAsyncTasksSupport" TagPrefix="wsp" %> +<%@ Register Src="../UserControls/QuotaViewer.ascx" TagName="QuotaViewer" TagPrefix="wsp" %> + + +
    +
    +
    + +
    +
    + +
    +
    +
    +
    + + +
    +
    + + +
    +
    + +
    +
    + + + DisplayName + Email + + + +
    +
    + + + + + + + + + <%# Eval("DisplayName") %> + + + + + + + + + + + + + + + + + + + +
    + +     + +
    +
    +
    + +
    +
    +
    +
    diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/Lync/LyncUsers.ascx.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/Lync/LyncUsers.ascx.cs new file mode 100644 index 00000000..cefe0967 --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/Lync/LyncUsers.ascx.cs @@ -0,0 +1,100 @@ +// Copyright (c) 2011, Outercurve Foundation. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// - Redistributions of source code must retain the above copyright notice, this +// list of conditions and the following disclaimer. +// +// - Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// - Neither the name of the Outercurve Foundation nor the names of its +// contributors may be used to endorse or promote products derived from this +// software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +using System; +using WebsitePanel.Providers.Common; +using WebsitePanel.Providers.HostedSolution; + +namespace WebsitePanel.Portal.Lync +{ + public partial class LyncUsers : WebsitePanelModuleBase + { + protected void Page_Load(object sender, EventArgs e) + { + BindStats(); + } + + private void BindStats() + { + OrganizationStatistics stats = ES.Services.Organizations.GetOrganizationStatistics(PanelRequest.ItemID); + int allocatedLyncUsers = stats.AllocatedLyncUsers; + int usedUsers = stats.CreatedLyncUsers; + usersQuota.QuotaUsedValue = usedUsers; + usersQuota.QuotaValue = allocatedLyncUsers; + } + + protected void btnCreateUser_Click(object sender, EventArgs e) + { + Response.Redirect(EditUrl("ItemID", PanelRequest.ItemID.ToString(), "create_new_lync_user", + "SpaceID=" + PanelSecurity.PackageId)); + } + + public string GetAccountImage() + { + + return GetThemedImage("Exchange/admin_16.png"); + } + + public string GetUserEditUrl(string accountId) + { + return EditUrl("SpaceID", PanelSecurity.PackageId.ToString(), "edit_lync_user", + "AccountID=" + accountId, + "ItemID=" + PanelRequest.ItemID); + } + + + + protected void odsAccountsPaged_Selected(object sender, System.Web.UI.WebControls.ObjectDataSourceStatusEventArgs e) + { + + } + + protected void gvUsers_RowCommand(object sender, System.Web.UI.WebControls.GridViewCommandEventArgs e) + { + if (e.CommandName == "DeleteItem") + { + try + { + ResultObject res = ES.Services.Lync.DeleteLyncUser(PanelRequest.ItemID, Convert.ToInt32(e.CommandArgument)); + + messageBox.ShowMessage(res, "DELETE_LYNC_USER", "LYNC"); + + // rebind grid + gvUsers.DataBind(); + BindStats(); + + } + catch (Exception ex) + { + messageBox.ShowErrorMessage("DELETE_LYNC_USERS", ex); + } + } + } + + } +} \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/Lync/LyncUsers.ascx.designer.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/Lync/LyncUsers.ascx.designer.cs new file mode 100644 index 00000000..dea6472f --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/Lync/LyncUsers.ascx.designer.cs @@ -0,0 +1,159 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace WebsitePanel.Portal.Lync { + + + public partial class LyncUsers { + + /// + /// asyncTasks control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.EnableAsyncTasksSupport asyncTasks; + + /// + /// breadcrumb control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.ExchangeServer.UserControls.Breadcrumb breadcrumb; + + /// + /// menu control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.ExchangeServer.UserControls.Menu menu; + + /// + /// Image1 control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Image Image1; + + /// + /// locTitle control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Localize locTitle; + + /// + /// messageBox control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.UserControls.SimpleMessageBox messageBox; + + /// + /// btnCreateUser control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Button btnCreateUser; + + /// + /// SearchPanel control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Panel SearchPanel; + + /// + /// ddlSearchColumn control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.DropDownList ddlSearchColumn; + + /// + /// txtSearchValue control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.TextBox txtSearchValue; + + /// + /// cmdSearch control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.ImageButton cmdSearch; + + /// + /// gvUsers control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.GridView gvUsers; + + /// + /// odsAccountsPaged control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.ObjectDataSource odsAccountsPaged; + + /// + /// locQuota control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Localize locQuota; + + /// + /// usersQuota control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.QuotaViewer usersQuota; + + /// + /// FormComments control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Localize FormComments; + } +} diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/Lync/UserControls/LyncUserPlanSelector.ascx b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/Lync/UserControls/LyncUserPlanSelector.ascx new file mode 100644 index 00000000..c6d336f8 --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/Lync/UserControls/LyncUserPlanSelector.ascx @@ -0,0 +1,2 @@ +<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="LyncUserPlanSelector.ascx.cs" Inherits="WebsitePanel.Portal.Lync.UserControls.LyncUserPlanSelector" %> + \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/Lync/UserControls/LyncUserPlanSelector.ascx.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/Lync/UserControls/LyncUserPlanSelector.ascx.cs new file mode 100644 index 00000000..31ba7eef --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/Lync/UserControls/LyncUserPlanSelector.ascx.cs @@ -0,0 +1,100 @@ +// Copyright (c) 2011, Outercurve Foundation. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// - Redistributions of source code must retain the above copyright notice, this +// list of conditions and the following disclaimer. +// +// - Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// - Neither the name of the Outercurve Foundation nor the names of its +// contributors may be used to endorse or promote products derived from this +// software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +using System; +using System.Web.UI.WebControls; + +namespace WebsitePanel.Portal.Lync.UserControls +{ + public partial class LyncUserPlanSelector : WebsitePanelControlBase + { + + private string planToSelect; + + public string planId + { + + get { return ddlPlan.SelectedItem.Value; } + set + { + planToSelect = value; + foreach(ListItem li in ddlPlan.Items) + { + if (li.Value == value) + { + ddlPlan.ClearSelection(); + li.Selected = true; + break; + } + } + } + } + + public int plansCount + { + get + { + return this.ddlPlan.Items.Count; + } + } + + + protected void Page_Load(object sender, EventArgs e) + { + if (!IsPostBack) + { + BindPlans(); + } + } + + private void BindPlans() + { + WebsitePanel.Providers.HostedSolution.LyncUserPlan[] plans = ES.Services.Lync.GetLyncUserPlans(PanelRequest.ItemID); + + foreach (WebsitePanel.Providers.HostedSolution.LyncUserPlan plan in plans) + { + ListItem li = new ListItem(); + li.Text = plan.LyncUserPlanName; + li.Value = plan.LyncUserPlanId.ToString(); + li.Selected = plan.IsDefault; + ddlPlan.Items.Add(li); + } + + foreach (ListItem li in ddlPlan.Items) + { + if (li.Value == planToSelect) + { + ddlPlan.ClearSelection(); + li.Selected = true; + break; + } + } + + } + } +} \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/Lync/UserControls/LyncUserPlanSelector.ascx.designer.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/Lync/UserControls/LyncUserPlanSelector.ascx.designer.cs new file mode 100644 index 00000000..db7df3f3 --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/Lync/UserControls/LyncUserPlanSelector.ascx.designer.cs @@ -0,0 +1,24 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace WebsitePanel.Portal.Lync.UserControls { + + + public partial class LyncUserPlanSelector { + + /// + /// ddlPlan control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.DropDownList ddlPlan; + } +} diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ProviderControls/App_LocalResources/Lync_Settings.ascx.resx b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ProviderControls/App_LocalResources/Lync_Settings.ascx.resx new file mode 100644 index 00000000..79fdeff7 --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ProviderControls/App_LocalResources/Lync_Settings.ascx.resx @@ -0,0 +1,144 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Add + + + Located on the same server + + + Lync Servers + + + Root OU: + + + Lync Frontend and Director Servers + + + Enterprise pool or <br/>Standard Edition Server name: + + + Simple Url Base: + + + <Located on the same server> + + \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ProviderControls/Lync_Settings.ascx b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ProviderControls/Lync_Settings.ascx new file mode 100644 index 00000000..0d569521 --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ProviderControls/Lync_Settings.ascx @@ -0,0 +1,54 @@ +<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="Lync_Settings.ascx.cs" Inherits="WebsitePanel.Portal.ProviderControls.Lync_Settings" %> + + + + + + + + + + + + + + + + +
    + + + + +
    + + + + +
    + + + + +
    + + + + + + + + + + + + + + + +
    diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ProviderControls/Lync_Settings.ascx.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ProviderControls/Lync_Settings.ascx.cs new file mode 100644 index 00000000..0d7110ef --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ProviderControls/Lync_Settings.ascx.cs @@ -0,0 +1,181 @@ +// Copyright (c) 2011, Outercurve Foundation. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// - Redistributions of source code must retain the above copyright notice, this +// list of conditions and the following disclaimer. +// +// - Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// - Neither the name of the Outercurve Foundation nor the names of its +// contributors may be used to endorse or promote products derived from this +// software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +using System; +using System.Collections.Generic; +using System.Data; +using System.Web.UI.WebControls; +using WebsitePanel.EnterpriseServer; +using WebsitePanel.Providers.HostedSolution; + +namespace WebsitePanel.Portal.ProviderControls +{ + public partial class Lync_Settings : WebsitePanelControlBase, IHostingServiceProviderSettings + { + + public const string LyncServersData = "LyncServersData"; + + protected void Page_Load(object sender, EventArgs e) + { + + } + + + + public void BindSettings(System.Collections.Specialized.StringDictionary settings) + { + txtServerName.Text = settings[LyncConstants.PoolFQDN]; + txtSimpleUrlBase.Text = settings[LyncConstants.SimpleUrlRoot]; + + + LyncServers = settings["LyncServersServiceID"]; + + BindLyncServices(ddlLyncServers); + + Utils.SelectListItem(ddlLyncServers, settings["LyncServersServiceID"]); + + UpdateLyncServersGrid(); + } + + public void SaveSettings(System.Collections.Specialized.StringDictionary settings) + { + settings[LyncConstants.PoolFQDN] = txtServerName.Text.Trim(); + settings[LyncConstants.SimpleUrlRoot] = txtSimpleUrlBase.Text.Trim(); + + settings["LyncServersServiceID"] = LyncServers; + } + + + public string LyncServers + { + get + { + return ViewState[LyncServersData] != null ? ViewState[LyncServersData].ToString() : string.Empty; + } + set + { + ViewState[LyncServersData] = value; + } + } + + + protected void btnAddLyncServer_Click(object sender, EventArgs e) + { + if (!string.IsNullOrEmpty(LyncServers)) + LyncServers += ","; + + LyncServers += ddlLyncServers.SelectedItem.Value; + + UpdateLyncServersGrid(); + BindLyncServices(ddlLyncServers); + + } + + public List GetServices(string data) + { + if (string.IsNullOrEmpty(data)) + return null; + List list = new List(); + string[] servicesIds = data.Split(','); + foreach (string current in servicesIds) + { + ServiceInfo serviceInfo = ES.Services.Servers.GetServiceInfo(Utils.ParseInt(current)); + list.Add(serviceInfo); + } + + + return list; + } + + private void UpdateLyncServersGrid() + { + gvLyncServers.DataSource = GetServices(LyncServers); + gvLyncServers.DataBind(); + } + + + public void BindLyncServices(DropDownList ddl) + { + ddl.Items.Clear(); + + ServiceInfo serviceInfo = ES.Services.Servers.GetServiceInfo(PanelRequest.ServiceId); + DataView dvServices = ES.Services.Servers.GetRawServicesByGroupName(ResourceGroups.Lync).Tables[0].DefaultView; + + foreach (DataRowView dr in dvServices) + { + int serviceId = (int)dr["ServiceID"]; + ServiceInfo currentServiceInfo = ES.Services.Servers.GetServiceInfo(serviceId); + + if (currentServiceInfo == null || currentServiceInfo.ProviderId != serviceInfo.ProviderId) + continue; + + List services = GetServices(LyncServers); + bool exists = false; + if (services != null) + foreach (ServiceInfo current in services) + { + if (current != null && current.ServiceId == serviceId) + { + exists = true; + break; + } + } + + if (!exists) + ddl.Items.Add(new ListItem(dr["FullServiceName"].ToString(), serviceId.ToString())); + + } + + ddl.Visible = ddl.Items.Count != 0; + btnAddLyncServer.Visible = ddl.Items.Count != 0; + + } + + protected void gvLyncServers_RowCommand(object sender, GridViewCommandEventArgs e) + { + if (e.CommandName == "RemoveServer") + { + string str = string.Empty; + List services = GetServices(LyncServers); + foreach (ServiceInfo current in services) + { + if (current.ServiceId == Utils.ParseInt(e.CommandArgument.ToString())) + continue; + + + str += current.ServiceId + ","; + } + + LyncServers = str.TrimEnd(','); + UpdateLyncServersGrid(); + BindLyncServices(ddlLyncServers); + } + } + + } +} \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ProviderControls/Lync_Settings.ascx.designer.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ProviderControls/Lync_Settings.ascx.designer.cs new file mode 100644 index 00000000..78c838e3 --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ProviderControls/Lync_Settings.ascx.designer.cs @@ -0,0 +1,105 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace WebsitePanel.Portal.ProviderControls { + + + public partial class Lync_Settings { + + /// + /// locServerName control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Localize locServerName; + + /// + /// txtServerName control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.TextBox txtServerName; + + /// + /// RequiredFieldValidator2 control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.RequiredFieldValidator RequiredFieldValidator2; + + /// + /// locSimpleUrlBase control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Localize locSimpleUrlBase; + + /// + /// txtSimpleUrlBase control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.TextBox txtSimpleUrlBase; + + /// + /// RequiredFieldValidator1 control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.RequiredFieldValidator RequiredFieldValidator1; + + /// + /// locLynServers control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Localize locLynServers; + + /// + /// ddlLyncServers control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.DropDownList ddlLyncServers; + + /// + /// btnAddLyncServer control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Button btnAddLyncServer; + + /// + /// gvLyncServers control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.GridView gvLyncServers; + } +} diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/SpaceQuotas.ascx b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/SpaceQuotas.ascx index 6ef28dbf..66a65218 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/SpaceQuotas.ascx +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/SpaceQuotas.ascx @@ -26,6 +26,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + + @@ -34,9 +59,9 @@ - - - + + + diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/SpaceQuotas.ascx.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/SpaceQuotas.ascx.cs index 211953ad..173489f7 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/SpaceQuotas.ascx.cs +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/SpaceQuotas.ascx.cs @@ -54,13 +54,18 @@ namespace WebsitePanel.Portal { // QUOTA CONTROL ID <=> TABLE ROW CONTROL ID { "quotaDiskspace", "pnlDiskspace" }, - { "quotaBandwidth", "pnlBandwidth" }, - { "quotaFtpAccounts", "pnlFtpAccounts" }, + { "quotaBandwidth", "pnlBandwidth" }, { "quotaDomains", "pnlDomains" }, { "quotaSubDomains", "pnlSubDomains" }, { "quotaDomainPointers", "pnlDomainPointers" }, - { "quotaMailAccounts", "pnlMailAccounts" }, + { "quotaUserAccounts", "pnlUserAccounts" }, + { "quotaMailAccounts", "pnlMailboxes" }, + { "quotaOCSUsers", "pnlOCSUsers" }, + { "quotaLyncUsers", "pnlLyncUsers" }, + { "quotaBlackBerryUsers", "pnlBlackBerryUsers" }, + { "quotaSharepointSites", "pnlSharepointSites" }, { "quotaWebSites", "pnlWebSites" }, + { "quotaDatabases", "pnlDatabases" }, { "quotaNumberOfVm", "pnlHyperVForPC" } }; diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/SpaceQuotas.ascx.designer.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/SpaceQuotas.ascx.designer.cs index 3f4f3b9c..f6478bd6 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/SpaceQuotas.ascx.designer.cs +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/SpaceQuotas.ascx.designer.cs @@ -147,6 +147,168 @@ namespace WebsitePanel.Portal { ///
    protected global::WebsitePanel.Portal.Quota quotaDomainPointers; + /// + /// pnlUserAccounts control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.HtmlControls.HtmlTableRow pnlUserAccounts; + + /// + /// lblUserAccounts control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Label lblUserAccounts; + + /// + /// quotaUserAccounts control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.Quota quotaUserAccounts; + + /// + /// pnlMailAccounts control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.HtmlControls.HtmlTableRow pnlMailAccounts; + + /// + /// lblMailAccounts control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Label lblMailAccounts; + + /// + /// quotaMailAccounts control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.Quota quotaMailAccounts; + + /// + /// pnlOCSUsers control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.HtmlControls.HtmlTableRow pnlOCSUsers; + + /// + /// lblOCSUsers control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Label lblOCSUsers; + + /// + /// quotaOCSUsers control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.Quota quotaOCSUsers; + + /// + /// pnlLyncUsers control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.HtmlControls.HtmlTableRow pnlLyncUsers; + + /// + /// lblLyncUsers control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Label lblLyncUsers; + + /// + /// quotaLyncUsers control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.Quota quotaLyncUsers; + + /// + /// pnlBlackBerryUsers control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.HtmlControls.HtmlTableRow pnlBlackBerryUsers; + + /// + /// lblBlackBerryUsers control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Label lblBlackBerryUsers; + + /// + /// quotaBlackBerryUsers control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.Quota quotaBlackBerryUsers; + + /// + /// pnlSharepointSites control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.HtmlControls.HtmlTableRow pnlSharepointSites; + + /// + /// lblSharepointSites control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Label lblSharepointSites; + + /// + /// quotaSharepointSites control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.Quota quotaSharepointSites; + /// /// pnlWebSites control. /// @@ -202,31 +364,31 @@ namespace WebsitePanel.Portal { protected global::WebsitePanel.Portal.Quota quotaFtpAccounts; /// - /// pnlMailAccounts control. + /// pnlDatabases control. /// /// /// Auto-generated field. /// To modify move field declaration from designer file to code-behind file. /// - protected global::System.Web.UI.HtmlControls.HtmlTableRow pnlMailAccounts; + protected global::System.Web.UI.HtmlControls.HtmlTableRow pnlDatabases; /// - /// lblMailAccounts control. + /// lblDatabases control. /// /// /// Auto-generated field. /// To modify move field declaration from designer file to code-behind file. /// - protected global::System.Web.UI.WebControls.Label lblMailAccounts; + protected global::System.Web.UI.WebControls.Label lblDatabases; /// - /// quotaMailAccounts control. + /// quotaDatabases control. /// /// /// Auto-generated field. /// To modify move field declaration from designer file to code-behind file. /// - protected global::WebsitePanel.Portal.Quota quotaMailAccounts; + protected global::WebsitePanel.Portal.Quota quotaDatabases; /// /// pnlHyperVForPC control. diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/WebsitePanel.Portal.Modules.csproj b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/WebsitePanel.Portal.Modules.csproj index 6c2fe5c9..1e873ce9 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/WebsitePanel.Portal.Modules.csproj +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/WebsitePanel.Portal.Modules.csproj @@ -161,6 +161,7 @@ + @@ -224,6 +225,62 @@ MailboxPlanSelector.ascx + + LyncAddFederationDomain.ascx + ASPXCodeBehind + + + LyncAddFederationDomain.ascx + + + LyncAddLyncUserPlan.ascx + ASPXCodeBehind + + + LyncAddLyncUserPlan.ascx + + + LyncCreateUser.ascx + ASPXCodeBehind + + + LyncCreateUser.ascx + + + LyncEditUser.ascx + ASPXCodeBehind + + + LyncEditUser.ascx + + + LyncFederationDomains.ascx + ASPXCodeBehind + + + LyncFederationDomains.ascx + + + LyncUserPlans.ascx + ASPXCodeBehind + + + LyncUserPlans.ascx + + + LyncUsers.ascx + ASPXCodeBehind + + + LyncUsers.ascx + + + LyncUserPlanSelector.ascx + ASPXCodeBehind + + + LyncUserPlanSelector.ascx + hMailServer5_EditAccount.ascx ASPXCodeBehind @@ -269,6 +326,13 @@ hMailServer5_Settings.ascx + + Lync_Settings.ascx + ASPXCodeBehind + + + Lync_Settings.ascx + NotifyOverusedDatabases.ascx ASPXCodeBehind @@ -3690,12 +3754,21 @@ + + + + + + + + + @@ -4813,6 +4886,14 @@ + + + + + + + + Designer @@ -5766,7 +5847,9 @@ Designer - + + + + \ No newline at end of file diff --git a/WebsitePanel/Sources/WSPTransportAgent/WSPTransportAgent.reg b/WebsitePanel/Sources/WSPTransportAgent/WSPTransportAgent.reg new file mode 100644 index 00000000..755c888a --- /dev/null +++ b/WebsitePanel/Sources/WSPTransportAgent/WSPTransportAgent.reg @@ -0,0 +1,15 @@ +Windows Registry Editor Version 5.00 + +[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\eventlog\MEACPTransportAgent] +"MaxSize"=dword:00080000 +"AutoBackupLogFiles"=dword:00000000 +"Retention"=dword:00000000 + +[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\eventlog\MEACPTransportAgent\MEACPTransportAgent] +"EventMessageFile"=hex(2):43,00,3a,00,5c,00,57,00,69,00,6e,00,64,00,6f,00,77,\ + 00,73,00,5c,00,4d,00,69,00,63,00,72,00,6f,00,73,00,6f,00,66,00,74,00,2e,00,\ + 4e,00,45,00,54,00,5c,00,46,00,72,00,61,00,6d,00,65,00,77,00,6f,00,72,00,6b,\ + 00,36,00,34,00,5c,00,76,00,34,00,2e,00,30,00,2e,00,33,00,30,00,33,00,31,00,\ + 39,00,5c,00,45,00,76,00,65,00,6e,00,74,00,4c,00,6f,00,67,00,4d,00,65,00,73,\ + 00,73,00,61,00,67,00,65,00,73,00,2e,00,64,00,6c,00,6c,00,00,00 + diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.sln b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.sln index fb708ef8..a88f65b6 100644 --- a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.sln +++ b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.sln @@ -43,6 +43,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WebsitePanel.Plugins.PayPal EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WebsitePanel.Templates", "WebsitePanel.Templates\WebsitePanel.Templates.csproj", "{387FA0EF-3927-45FF-8F8F-BCCD735540C6}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WSPTransportAgent", "WSPTransportAgent\WSPTransportAgent.csproj", "{D959F137-A56F-4F4E-BA80-599FBE3700E3}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -107,6 +109,10 @@ Global {387FA0EF-3927-45FF-8F8F-BCCD735540C6}.Debug|Any CPU.Build.0 = Debug|Any CPU {387FA0EF-3927-45FF-8F8F-BCCD735540C6}.Release|Any CPU.ActiveCfg = Release|Any CPU {387FA0EF-3927-45FF-8F8F-BCCD735540C6}.Release|Any CPU.Build.0 = Release|Any CPU + {D959F137-A56F-4F4E-BA80-599FBE3700E3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {D959F137-A56F-4F4E-BA80-599FBE3700E3}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D959F137-A56F-4F4E-BA80-599FBE3700E3}.Release|Any CPU.ActiveCfg = Release|Any CPU + {D959F137-A56F-4F4E-BA80-599FBE3700E3}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/WebsitePanel.WebPortal.csproj b/WebsitePanel/Sources/WebsitePanel.WebPortal/WebsitePanel.WebPortal.csproj index 30bb5548..2f0e726b 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/WebsitePanel.WebPortal.csproj +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/WebsitePanel.WebPortal.csproj @@ -106,6 +106,7 @@ + From 5662b81116e3b5761159642f4f07126d814f440e Mon Sep 17 00:00:00 2001 From: robvde Date: Tue, 10 Jul 2012 12:30:00 +0400 Subject: [PATCH 08/20] Moved WSPRoutingAgent to Tools --- .../Sources/{ => Tools}/WSPTransportAgent/App.config | 0 .../WSPTransportAgent/Properties/AssemblyInfo.cs | 0 .../{ => Tools}/WSPTransportAgent/WSPRoutingAgent.cs | 0 .../{ => Tools}/WSPTransportAgent/WSPTransportAgent.csproj | 0 .../{ => Tools}/WSPTransportAgent/WSPTransportAgent.reg | 0 WebsitePanel/Sources/WebsitePanel.EnterpriseServer.sln | 6 ------ 6 files changed, 6 deletions(-) rename WebsitePanel/Sources/{ => Tools}/WSPTransportAgent/App.config (100%) rename WebsitePanel/Sources/{ => Tools}/WSPTransportAgent/Properties/AssemblyInfo.cs (100%) rename WebsitePanel/Sources/{ => Tools}/WSPTransportAgent/WSPRoutingAgent.cs (100%) rename WebsitePanel/Sources/{ => Tools}/WSPTransportAgent/WSPTransportAgent.csproj (100%) rename WebsitePanel/Sources/{ => Tools}/WSPTransportAgent/WSPTransportAgent.reg (100%) diff --git a/WebsitePanel/Sources/WSPTransportAgent/App.config b/WebsitePanel/Sources/Tools/WSPTransportAgent/App.config similarity index 100% rename from WebsitePanel/Sources/WSPTransportAgent/App.config rename to WebsitePanel/Sources/Tools/WSPTransportAgent/App.config diff --git a/WebsitePanel/Sources/WSPTransportAgent/Properties/AssemblyInfo.cs b/WebsitePanel/Sources/Tools/WSPTransportAgent/Properties/AssemblyInfo.cs similarity index 100% rename from WebsitePanel/Sources/WSPTransportAgent/Properties/AssemblyInfo.cs rename to WebsitePanel/Sources/Tools/WSPTransportAgent/Properties/AssemblyInfo.cs diff --git a/WebsitePanel/Sources/WSPTransportAgent/WSPRoutingAgent.cs b/WebsitePanel/Sources/Tools/WSPTransportAgent/WSPRoutingAgent.cs similarity index 100% rename from WebsitePanel/Sources/WSPTransportAgent/WSPRoutingAgent.cs rename to WebsitePanel/Sources/Tools/WSPTransportAgent/WSPRoutingAgent.cs diff --git a/WebsitePanel/Sources/WSPTransportAgent/WSPTransportAgent.csproj b/WebsitePanel/Sources/Tools/WSPTransportAgent/WSPTransportAgent.csproj similarity index 100% rename from WebsitePanel/Sources/WSPTransportAgent/WSPTransportAgent.csproj rename to WebsitePanel/Sources/Tools/WSPTransportAgent/WSPTransportAgent.csproj diff --git a/WebsitePanel/Sources/WSPTransportAgent/WSPTransportAgent.reg b/WebsitePanel/Sources/Tools/WSPTransportAgent/WSPTransportAgent.reg similarity index 100% rename from WebsitePanel/Sources/WSPTransportAgent/WSPTransportAgent.reg rename to WebsitePanel/Sources/Tools/WSPTransportAgent/WSPTransportAgent.reg diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.sln b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.sln index a88f65b6..fb708ef8 100644 --- a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.sln +++ b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.sln @@ -43,8 +43,6 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WebsitePanel.Plugins.PayPal EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WebsitePanel.Templates", "WebsitePanel.Templates\WebsitePanel.Templates.csproj", "{387FA0EF-3927-45FF-8F8F-BCCD735540C6}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WSPTransportAgent", "WSPTransportAgent\WSPTransportAgent.csproj", "{D959F137-A56F-4F4E-BA80-599FBE3700E3}" -EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -109,10 +107,6 @@ Global {387FA0EF-3927-45FF-8F8F-BCCD735540C6}.Debug|Any CPU.Build.0 = Debug|Any CPU {387FA0EF-3927-45FF-8F8F-BCCD735540C6}.Release|Any CPU.ActiveCfg = Release|Any CPU {387FA0EF-3927-45FF-8F8F-BCCD735540C6}.Release|Any CPU.Build.0 = Release|Any CPU - {D959F137-A56F-4F4E-BA80-599FBE3700E3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {D959F137-A56F-4F4E-BA80-599FBE3700E3}.Debug|Any CPU.Build.0 = Debug|Any CPU - {D959F137-A56F-4F4E-BA80-599FBE3700E3}.Release|Any CPU.ActiveCfg = Release|Any CPU - {D959F137-A56F-4F4E-BA80-599FBE3700E3}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE From 3c3374d8aea22ad4d55e1da951283478eaec3556 Mon Sep 17 00:00:00 2001 From: robvde Date: Tue, 10 Jul 2012 13:10:33 +0400 Subject: [PATCH 09/20] ResourceGroups updated with ShowGRoup field. By setting this field to zero the resourcegroup will not show up. This is typically done to hide those providers from an deployment you dont want to support. To remove items from the search list set the Searchable field to 'False' in ServiceItemTypes --- WebsitePanel/Database/install_db.sql | 63 ++++----- WebsitePanel/Database/update_db.sql | 197 +++++++++++++++++++++++++++ 2 files changed, 229 insertions(+), 31 deletions(-) diff --git a/WebsitePanel/Database/install_db.sql b/WebsitePanel/Database/install_db.sql index e260326d..14e16e2b 100644 --- a/WebsitePanel/Database/install_db.sql +++ b/WebsitePanel/Database/install_db.sql @@ -10604,6 +10604,7 @@ CREATE TABLE [dbo].[ResourceGroups]( [GroupName] [nvarchar](100) COLLATE Latin1_General_CI_AS NOT NULL, [GroupOrder] [int] NOT NULL, [GroupController] [nvarchar](1000) COLLATE Latin1_General_CI_AS NULL, + [ShowGroup] [bit] NULL, CONSTRAINT [PK_ResourceGroups] PRIMARY KEY CLUSTERED ( [GroupID] ASC @@ -10611,49 +10612,49 @@ CREATE TABLE [dbo].[ResourceGroups]( ) GO -INSERT [dbo].[ResourceGroups] ([GroupID], [GroupName], [GroupOrder], [GroupController]) VALUES (1, N'OS', 1, N'WebsitePanel.EnterpriseServer.OperatingSystemController') +INSERT [dbo].[ResourceGroups] ([GroupID], [GroupName], [GroupOrder], [GroupController]) VALUES (1, N'OS', 1, N'WebsitePanel.EnterpriseServer.OperatingSystemController', 1) GO -INSERT [dbo].[ResourceGroups] ([GroupID], [GroupName], [GroupOrder], [GroupController]) VALUES (2, N'Web', 2, N'WebsitePanel.EnterpriseServer.WebServerController') +INSERT [dbo].[ResourceGroups] ([GroupID], [GroupName], [GroupOrder], [GroupController]) VALUES (2, N'Web', 2, N'WebsitePanel.EnterpriseServer.WebServerController', 1) GO -INSERT [dbo].[ResourceGroups] ([GroupID], [GroupName], [GroupOrder], [GroupController]) VALUES (3, N'FTP', 3, N'WebsitePanel.EnterpriseServer.FtpServerController') +INSERT [dbo].[ResourceGroups] ([GroupID], [GroupName], [GroupOrder], [GroupController]) VALUES (3, N'FTP', 3, N'WebsitePanel.EnterpriseServer.FtpServerController', 1) GO -INSERT [dbo].[ResourceGroups] ([GroupID], [GroupName], [GroupOrder], [GroupController]) VALUES (4, N'Mail', 4, N'WebsitePanel.EnterpriseServer.MailServerController') +INSERT [dbo].[ResourceGroups] ([GroupID], [GroupName], [GroupOrder], [GroupController]) VALUES (4, N'Mail', 4, N'WebsitePanel.EnterpriseServer.MailServerController', 1) GO -INSERT [dbo].[ResourceGroups] ([GroupID], [GroupName], [GroupOrder], [GroupController]) VALUES (5, N'MsSQL2000', 8, N'WebsitePanel.EnterpriseServer.DatabaseServerController') +INSERT [dbo].[ResourceGroups] ([GroupID], [GroupName], [GroupOrder], [GroupController]) VALUES (5, N'MsSQL2000', 8, N'WebsitePanel.EnterpriseServer.DatabaseServerController', 1) GO -INSERT [dbo].[ResourceGroups] ([GroupID], [GroupName], [GroupOrder], [GroupController]) VALUES (6, N'MySQL4', 12, N'WebsitePanel.EnterpriseServer.DatabaseServerController') +INSERT [dbo].[ResourceGroups] ([GroupID], [GroupName], [GroupOrder], [GroupController]) VALUES (6, N'MySQL4', 12, N'WebsitePanel.EnterpriseServer.DatabaseServerController', 1) GO -INSERT [dbo].[ResourceGroups] ([GroupID], [GroupName], [GroupOrder], [GroupController]) VALUES (7, N'DNS', 17, N'WebsitePanel.EnterpriseServer.DnsServerController') +INSERT [dbo].[ResourceGroups] ([GroupID], [GroupName], [GroupOrder], [GroupController]) VALUES (7, N'DNS', 17, N'WebsitePanel.EnterpriseServer.DnsServerController', 1) GO -INSERT [dbo].[ResourceGroups] ([GroupID], [GroupName], [GroupOrder], [GroupController]) VALUES (8, N'Statistics', 18, N'WebsitePanel.EnterpriseServer.StatisticsServerController') +INSERT [dbo].[ResourceGroups] ([GroupID], [GroupName], [GroupOrder], [GroupController]) VALUES (8, N'Statistics', 18, N'WebsitePanel.EnterpriseServer.StatisticsServerController', 1) GO -INSERT [dbo].[ResourceGroups] ([GroupID], [GroupName], [GroupOrder], [GroupController]) VALUES (9, N'SharePoint', 14, N'WebsitePanel.EnterpriseServer.SharePointServerController') +INSERT [dbo].[ResourceGroups] ([GroupID], [GroupName], [GroupOrder], [GroupController]) VALUES (9, N'SharePoint', 14, N'WebsitePanel.EnterpriseServer.SharePointServerController', 1) GO -INSERT [dbo].[ResourceGroups] ([GroupID], [GroupName], [GroupOrder], [GroupController]) VALUES (10, N'MsSQL2005', 9, N'WebsitePanel.EnterpriseServer.DatabaseServerController') +INSERT [dbo].[ResourceGroups] ([GroupID], [GroupName], [GroupOrder], [GroupController]) VALUES (10, N'MsSQL2005', 9, N'WebsitePanel.EnterpriseServer.DatabaseServerController', 1) GO -INSERT [dbo].[ResourceGroups] ([GroupID], [GroupName], [GroupOrder], [GroupController]) VALUES (11, N'MySQL5', 13, N'WebsitePanel.EnterpriseServer.DatabaseServerController') +INSERT [dbo].[ResourceGroups] ([GroupID], [GroupName], [GroupOrder], [GroupController]) VALUES (11, N'MySQL5', 13, N'WebsitePanel.EnterpriseServer.DatabaseServerController', 1) GO -INSERT [dbo].[ResourceGroups] ([GroupID], [GroupName], [GroupOrder], [GroupController]) VALUES (12, N'Exchange', 5, NULL) +INSERT [dbo].[ResourceGroups] ([GroupID], [GroupName], [GroupOrder], [GroupController]) VALUES (12, N'Exchange', 5, NULL, 1) GO -INSERT [dbo].[ResourceGroups] ([GroupID], [GroupName], [GroupOrder], [GroupController]) VALUES (13, N'Hosted Organizations', 6, NULL) +INSERT [dbo].[ResourceGroups] ([GroupID], [GroupName], [GroupOrder], [GroupController]) VALUES (13, N'Hosted Organizations', 6, NULL, 1) GO -INSERT [dbo].[ResourceGroups] ([GroupID], [GroupName], [GroupOrder], [GroupController]) VALUES (20, N'Hosted SharePoint', 15, N'WebsitePanel.EnterpriseServer.HostedSharePointServerController') +INSERT [dbo].[ResourceGroups] ([GroupID], [GroupName], [GroupOrder], [GroupController]) VALUES (20, N'Hosted SharePoint', 15, N'WebsitePanel.EnterpriseServer.HostedSharePointServerController', 1) GO -INSERT [dbo].[ResourceGroups] ([GroupID], [GroupName], [GroupOrder], [GroupController]) VALUES (21, N'Hosted CRM', 16, NULL) +INSERT [dbo].[ResourceGroups] ([GroupID], [GroupName], [GroupOrder], [GroupController]) VALUES (21, N'Hosted CRM', 16, NULL, 1) GO -INSERT [dbo].[ResourceGroups] ([GroupID], [GroupName], [GroupOrder], [GroupController]) VALUES (22, N'MsSQL2008', 10, N'WebsitePanel.EnterpriseServer.DatabaseServerController') +INSERT [dbo].[ResourceGroups] ([GroupID], [GroupName], [GroupOrder], [GroupController]) VALUES (22, N'MsSQL2008', 10, N'WebsitePanel.EnterpriseServer.DatabaseServerController', 1) GO -INSERT [dbo].[ResourceGroups] ([GroupID], [GroupName], [GroupOrder], [GroupController]) VALUES (23, N'MsSQL2012', 11, N'WebsitePanel.EnterpriseServer.DatabaseServerController') +INSERT [dbo].[ResourceGroups] ([GroupID], [GroupName], [GroupOrder], [GroupController]) VALUES (23, N'MsSQL2012', 11, N'WebsitePanel.EnterpriseServer.DatabaseServerController', 1) GO -INSERT [dbo].[ResourceGroups] ([GroupID], [GroupName], [GroupOrder], [GroupController]) VALUES (30, N'VPS', 19, NULL) +INSERT [dbo].[ResourceGroups] ([GroupID], [GroupName], [GroupOrder], [GroupController]) VALUES (30, N'VPS', 19, NULL, 1) GO -INSERT [dbo].[ResourceGroups] ([GroupID], [GroupName], [GroupOrder], [GroupController]) VALUES (31, N'BlackBerry', 21, NULL) +INSERT [dbo].[ResourceGroups] ([GroupID], [GroupName], [GroupOrder], [GroupController]) VALUES (31, N'BlackBerry', 21, NULL, 1) GO -INSERT [dbo].[ResourceGroups] ([GroupID], [GroupName], [GroupOrder], [GroupController]) VALUES (32, N'OCS', 22, NULL) +INSERT [dbo].[ResourceGroups] ([GroupID], [GroupName], [GroupOrder], [GroupController]) VALUES (32, N'OCS', 22, NULL, 1) GO -INSERT [dbo].[ResourceGroups] ([GroupID], [GroupName], [GroupOrder], [GroupController]) VALUES (41, N'Lync',23, NULL) +INSERT [dbo].[ResourceGroups] ([GroupID], [GroupName], [GroupOrder], [GroupController]) VALUES (41, N'Lync',23, NULL, 1) GO -INSERT [dbo].[ResourceGroups] ([GroupID], [GroupName], [GroupOrder], [GroupController]) VALUES (40, N'VPSForPC', 20, NULL) +INSERT [dbo].[ResourceGroups] ([GroupID], [GroupName], [GroupOrder], [GroupController]) VALUES (40, N'VPSForPC', 20, NULL, 1) GO SET ANSI_NULLS ON GO @@ -26230,7 +26231,7 @@ GO -CREATE PROCEDURE GetHostingPlanQuotas +CREATE PROCEDURE [dbo].[GetHostingPlanQuotas] ( @ActorID int, @PlanID int, @@ -26260,8 +26261,9 @@ SELECT dbo.GetPackageAllocatedResource(@PackageID, RG.GroupID, @ServerID) AS ParentEnabled, ISNULL(HPR.CalculateDiskSpace, 1) AS CalculateDiskSpace, ISNULL(HPR.CalculateBandwidth, 1) AS CalculateBandwidth -FROM ResourceGroups AS RG +FROM ResourceGroups AS RG LEFT OUTER JOIN HostingPlanResources AS HPR ON RG.GroupID = HPR.GroupID AND HPR.PlanID = @PlanID +WHERE (ShowGroup = 1) ORDER BY RG.GroupOrder -- get quotas by groups @@ -26310,7 +26312,6 @@ RETURN - GO @@ -40497,7 +40498,7 @@ GO -CREATE PROCEDURE GetRawServicesByServerID +CREATE PROCEDURE [dbo].[GetRawServicesByServerID] ( @ActorID int, @ServerID int @@ -40513,7 +40514,7 @@ SELECT GroupID, GroupName FROM ResourceGroups -WHERE @IsAdmin = 1 +WHERE @IsAdmin = 1 AND (ShowGroup = 1) ORDER BY GroupOrder -- services @@ -40532,7 +40533,7 @@ WHERE AND @IsAdmin = 1 ORDER BY RG.GroupOrder -RETURN +RETURN @@ -44000,7 +44001,7 @@ GO -CREATE PROCEDURE GetVirtualServices +CREATE PROCEDURE [dbo].[GetVirtualServices] ( @ActorID int, @ServerID int @@ -44021,7 +44022,7 @@ SELECT FROM ResourceGroups AS RG LEFT OUTER JOIN VirtualGroups AS VRG ON RG.GroupID = VRG.GroupID AND VRG.ServerID = @ServerID WHERE - @IsAdmin = 1 + @IsAdmin = 1 AND (ShowGroup = 1) ORDER BY RG.GroupOrder -- services @@ -44040,7 +44041,7 @@ WHERE VS.ServerID = @ServerID AND @IsAdmin = 1 -RETURN +RETURN diff --git a/WebsitePanel/Database/update_db.sql b/WebsitePanel/Database/update_db.sql index 3ad8ad99..e7d7564a 100644 --- a/WebsitePanel/Database/update_db.sql +++ b/WebsitePanel/Database/update_db.sql @@ -987,6 +987,14 @@ ALTER TABLE [dbo].[GlobalDnsRecords] ADD END GO +IF NOT EXISTS(select 1 from sys.columns COLS INNER JOIN sys.objects OBJS ON OBJS.object_id=COLS.object_id and OBJS.type='U' AND OBJS.name='ResourceGroups' AND COLS.name='ShowGroup') +BEGIN +ALTER TABLE [dbo].[ResourceGroups] ADD [ShowGroup] [bit] NULL + +UPDATE [dbo].[ResourceGroups] SET ShowGRoup=1 +END +GO + ALTER PROCEDURE [dbo].[AddDnsRecord] @@ -3444,3 +3452,192 @@ UPDATE LyncUserPlans SET IsDefault=1 WHERE LyncUserPlanId=@LyncUserPlanId RETURN' END GO + + + + + + + + + + + + + + + +ALTER PROCEDURE [dbo].[GetHostingPlanQuotas] +( + @ActorID int, + @PlanID int, + @PackageID int, + @ServerID int +) +AS + +-- check rights +IF dbo.CheckActorParentPackageRights(@ActorID, @PackageID) = 0 +RAISERROR('You are not allowed to access this package', 16, 1) + +DECLARE @IsAddon bit + +IF @ServerID = 0 +SELECT @ServerID = ServerID FROM Packages +WHERE PackageID = @PackageID + +-- get resource groups +SELECT + RG.GroupID, + RG.GroupName, + CASE + WHEN HPR.CalculateDiskSpace IS NULL THEN CAST(0 as bit) + ELSE CAST(1 as bit) + END AS Enabled, + dbo.GetPackageAllocatedResource(@PackageID, RG.GroupID, @ServerID) AS ParentEnabled, + ISNULL(HPR.CalculateDiskSpace, 1) AS CalculateDiskSpace, + ISNULL(HPR.CalculateBandwidth, 1) AS CalculateBandwidth +FROM ResourceGroups AS RG +LEFT OUTER JOIN HostingPlanResources AS HPR ON RG.GroupID = HPR.GroupID AND HPR.PlanID = @PlanID +WHERE (ShowGroup = 1) +ORDER BY RG.GroupOrder + +-- get quotas by groups +SELECT + Q.QuotaID, + Q.GroupID, + Q.QuotaName, + Q.QuotaDescription, + Q.QuotaTypeID, + ISNULL(HPQ.QuotaValue, 0) AS QuotaValue, + dbo.GetPackageAllocatedQuota(@PackageID, Q.QuotaID) AS ParentQuotaValue +FROM Quotas AS Q +LEFT OUTER JOIN HostingPlanQuotas AS HPQ ON Q.QuotaID = HPQ.QuotaID AND HPQ.PlanID = @PlanID +ORDER BY Q.QuotaOrder +RETURN +GO + + + + + + + + + + + + + + +ALTER PROCEDURE [dbo].[GetRawServicesByServerID] +( + @ActorID int, + @ServerID int +) +AS + +-- check rights +DECLARE @IsAdmin bit +SET @IsAdmin = dbo.CheckIsUserAdmin(@ActorID) + +-- resource groups +SELECT + GroupID, + GroupName +FROM ResourceGroups +WHERE @IsAdmin = 1 AND (ShowGroup = 1) +ORDER BY GroupOrder + +-- services +SELECT + S.ServiceID, + S.ServerID, + S.ServiceName, + S.Comments, + RG.GroupID, + PROV.DisplayName AS ProviderName +FROM Services AS S +INNER JOIN Providers AS PROV ON S.ProviderID = PROV.ProviderID +INNER JOIN ResourceGroups AS RG ON PROV.GroupID = RG.GroupID +WHERE + S.ServerID = @ServerID + AND @IsAdmin = 1 +ORDER BY RG.GroupOrder + +RETURN +GO + + + + + + + + + + + + + +ALTER PROCEDURE [dbo].[GetVirtualServices] +( + @ActorID int, + @ServerID int +) +AS + +-- check rights +DECLARE @IsAdmin bit +SET @IsAdmin = dbo.CheckIsUserAdmin(@ActorID) + +-- virtual groups +SELECT + VRG.VirtualGroupID, + RG.GroupID, + RG.GroupName, + ISNULL(VRG.DistributionType, 1) AS DistributionType, + ISNULL(VRG.BindDistributionToPrimary, 1) AS BindDistributionToPrimary +FROM ResourceGroups AS RG +LEFT OUTER JOIN VirtualGroups AS VRG ON RG.GroupID = VRG.GroupID AND VRG.ServerID = @ServerID +WHERE + @IsAdmin = 1 AND (ShowGroup = 1) +ORDER BY RG.GroupOrder + +-- services +SELECT + VS.ServiceID, + S.ServiceName, + S.Comments, + P.GroupID, + P.DisplayName, + SRV.ServerName +FROM VirtualServices AS VS +INNER JOIN Services AS S ON VS.ServiceID = S.ServiceID +INNER JOIN Servers AS SRV ON S.ServerID = SRV.ServerID +INNER JOIN Providers AS P ON S.ProviderID = P.ProviderID +WHERE + VS.ServerID = @ServerID + AND @IsAdmin = 1 + +RETURN +GO + + + + + + + + + + + + + + + + + + + From 0ba956b582b5ad4d48a467648e27b21e0c716165 Mon Sep 17 00:00:00 2001 From: robvde Date: Tue, 10 Jul 2012 13:50:56 +0400 Subject: [PATCH 10/20] Added the ability to specify the PlanName and PlanDescription of the Add-ons in the account summary template:
    Add-on Quantity Purchase Date
    #Addons[j].PlanName# #Addons[j].Quantity# #Addons[j].PurchaseDate#
    --- .../Packages/PackageAddonInfo.cs | 15 +++++++++++++++ .../Code/Packages/PackageController.cs | 15 +++++++++++++++ 2 files changed, 30 insertions(+) diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Base/Packages/PackageAddonInfo.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Base/Packages/PackageAddonInfo.cs index 5d571fbe..fd87dd84 100644 --- a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Base/Packages/PackageAddonInfo.cs +++ b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Base/Packages/PackageAddonInfo.cs @@ -43,6 +43,8 @@ namespace WebsitePanel.EnterpriseServer int statusId; DateTime purchaseDate; string comments; + string planName; + string planDescription; public PackageAddonInfo() @@ -90,5 +92,18 @@ namespace WebsitePanel.EnterpriseServer get { return this.statusId; } set { this.statusId = value; } } + + public string PlanName + { + get { return planName; } + set { planName = value; } + } + + public string PlanDescription + { + get { return planDescription; } + set { planDescription = value; } + } + } } diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/Packages/PackageController.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/Packages/PackageController.cs index baf64911..d336dfa0 100644 --- a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/Packages/PackageController.cs +++ b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/Packages/PackageController.cs @@ -1952,6 +1952,21 @@ namespace WebsitePanel.EnterpriseServer } items["Plans"] = plans; + //Add ons + Hashtable addOns = new Hashtable(); + int i = 0; + foreach (PackageInfo package in packages) + { + List lstAddOns = ObjectUtils.CreateListFromDataSet(GetPackageAddons(package.PackageId)); + foreach (PackageAddonInfo addOn in lstAddOns) + { + addOns.Add(i, addOn); + i++; + } + + } + items["Addons"] = addOns; + // package contexts Hashtable cntxs = new Hashtable(); foreach (PackageInfo package in packages) From da0966657b1c59edaaac0095f8c0d4bae25cf287 Mon Sep 17 00:00:00 2001 From: robvde Date: Tue, 10 Jul 2012 14:19:05 +0400 Subject: [PATCH 11/20] Object not found when creating distributionlist fixed --- .../ExchangeServerController.cs | 2 +- .../Exchange2007.cs | 34 ++++++++++--------- 2 files changed, 19 insertions(+), 17 deletions(-) diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/ExchangeServer/ExchangeServerController.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/ExchangeServer/ExchangeServerController.cs index 42a4e2bd..816eed66 100644 --- a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/ExchangeServer/ExchangeServerController.cs +++ b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/ExchangeServer/ExchangeServerController.cs @@ -1121,7 +1121,7 @@ namespace WebsitePanel.EnterpriseServer { return DataProvider.AddExchangeAccount(itemId, (int)accountType, accountName, displayName, primaryEmailAddress, mailEnabledPublicFolder, - mailboxManagerActions.ToString(), samAccountName, CryptoUtils.Encrypt(accountPassword), mailboxPlanId, subscriberNumber.Trim()); + mailboxManagerActions.ToString(), samAccountName, CryptoUtils.Encrypt(accountPassword), mailboxPlanId, (string.IsNullOrEmpty(subscriberNumber) ? null : subscriberNumber.Trim())); } private static void UpdateAccount(ExchangeAccount account) diff --git a/WebsitePanel/Sources/WebsitePanel.Providers.HostedSolution/Exchange2007.cs b/WebsitePanel/Sources/WebsitePanel.Providers.HostedSolution/Exchange2007.cs index d8f22589..60c3e411 100644 --- a/WebsitePanel/Sources/WebsitePanel.Providers.HostedSolution/Exchange2007.cs +++ b/WebsitePanel/Sources/WebsitePanel.Providers.HostedSolution/Exchange2007.cs @@ -3419,27 +3419,29 @@ namespace WebsitePanel.Providers.HostedSolution Runspace runSpace = null; try { - runSpace = OpenRunspace(); + runSpace = OpenRunspace(); - Command cmd = new Command("Get-DistributionGroup"); - cmd.Parameters.Add("Identity", accountName); - Collection result = ExecuteShellCommand(runSpace, cmd); - PSObject distributionGroup = result[0]; + Command cmd = new Command("Get-DistributionGroup"); + cmd.Parameters.Add("Identity", accountName); + Collection result = ExecuteShellCommand(runSpace, cmd); + PSObject distributionGroup = result[0]; - info.DisplayName = (string)GetPSObjectProperty(distributionGroup, "DisplayName"); - info.HideFromAddressBook = - (bool)GetPSObjectProperty(distributionGroup, "HiddenFromAddressListsEnabled"); + info.DisplayName = (string)GetPSObjectProperty(distributionGroup, "DisplayName"); + info.HideFromAddressBook = + (bool)GetPSObjectProperty(distributionGroup, "HiddenFromAddressListsEnabled"); - cmd = new Command("Get-Group"); - cmd.Parameters.Add("Identity", accountName); - result = ExecuteShellCommand(runSpace, cmd); - PSObject group = result[0]; + info.SAMAccountName = string.Format("{0}\\{1}", GetNETBIOSDomainName(), (string)GetPSObjectProperty(distributionGroup, "SamAccountName")); - info.ManagerAccount = GetGroupManagerAccount(runSpace, group); - info.MembersAccounts = GetGroupMembers(runSpace, accountName); - info.Notes = (string)GetPSObjectProperty(group, "Notes"); - } + cmd = new Command("Get-Group"); + cmd.Parameters.Add("Identity", accountName); + result = ExecuteShellCommand(runSpace, cmd); + PSObject group = result[0]; + + info.ManagerAccount = GetGroupManagerAccount(runSpace, group); + info.MembersAccounts = GetGroupMembers(runSpace, accountName); + info.Notes = (string)GetPSObjectProperty(group, "Notes"); + } finally { From 37af5eceac70f41237a878b64d6e25c7def9637a Mon Sep 17 00:00:00 2001 From: robvde Date: Wed, 11 Jul 2012 18:18:13 +0400 Subject: [PATCH 12/20] More granularity to the available roles: Available roles now in the platform: Administrator, Reseller, User, PlatformCSR, PlatformHelpdesk, ResellerCSR, ResellerHelpdesk. The platform CSR and Helpdesk are peer accounts on platform root level. The names can be used within the websitepanel_pages.config on Page and Module level. On module level the roles can be specified on the viewRoles attribute and readOnlyRoles attribute. When specifying the later all controls will be disabled within the Modile, the viewRoles just show the page or not. When nothing specified the page is just shown --- .../Common/BusinessErrorCodes.cs | 1 + .../Security/DemandAccount.cs | 6 +- .../Users/UserRole.cs | 6 +- .../Code/Common/SecurityContext.cs | 55 +++++- .../Code/Packages/PackageController.cs | 4 +- .../App_Data/WebsitePanel_Pages.config | 163 +++++++++--------- .../WebsitePanel.WebPortal/Code/PageModule.cs | 7 + .../Code/PortalConfiguration.cs | 4 + .../App_LocalResources/Peers.ascx.resx | 7 +- .../PeersEditPeer.ascx.resx | 7 +- .../Code/Framework/WebsitePanelControlBase.cs | 40 +++++ .../WebsitePanel/Code/Helpers/UsersHelper.cs | 1 + .../DesktopModules/WebsitePanel/Peers.ascx | 7 +- .../DesktopModules/WebsitePanel/Peers.ascx.cs | 30 +++- .../WebsitePanel/Peers.ascx.designer.cs | 34 +++- .../WebsitePanel/PeersEditPeer.ascx | 18 +- .../WebsitePanel/PeersEditPeer.ascx.cs | 85 ++++++++- .../PeersEditPeer.ascx.designer.cs | 30 +++- .../WebsitePanel/SpaceDetails.ascx.cs | 6 +- .../WebsitePanel/UserAccountDetails.ascx.cs | 3 +- .../WebsitePanel.WebPortal/Global.asax.cs | 36 ++-- 21 files changed, 423 insertions(+), 127 deletions(-) diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Base/Common/BusinessErrorCodes.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Base/Common/BusinessErrorCodes.cs index f709a65b..703eae8a 100644 --- a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Base/Common/BusinessErrorCodes.cs +++ b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Base/Common/BusinessErrorCodes.cs @@ -62,6 +62,7 @@ namespace WebsitePanel.EnterpriseServer public const int ERROR_USER_WRONG_USERNAME = -109; public const int ERROR_USER_WRONG_PASSWORD = -110; public const int ERROR_INVALID_USER_NAME = -111; + public const int ERROR_USER_ACCOUNT_NOT_ENOUGH_PERMISSIONS = -112; #endregion #region Packages diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Base/Security/DemandAccount.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Base/Security/DemandAccount.cs index a4807a65..720f6bd4 100644 --- a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Base/Security/DemandAccount.cs +++ b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Base/Security/DemandAccount.cs @@ -38,6 +38,10 @@ namespace WebsitePanel.EnterpriseServer NotDemo = 0x1, IsActive = 0x2, IsAdmin = 0x4, - IsReseller = 0x8 + IsReseller = 0x8, + IsPlatformCSR = 0x10, + IsPlatformHelpdesk = 0x20, + IsResellerCSR = 0x40, + IsResellerHelpdesk = 0x80, } } diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Base/Users/UserRole.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Base/Users/UserRole.cs index a58e4289..c83a3abb 100644 --- a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Base/Users/UserRole.cs +++ b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Base/Users/UserRole.cs @@ -37,6 +37,10 @@ namespace WebsitePanel.EnterpriseServer { Administrator = 1, Reseller = 2, - User = 3 + User = 3, + ResellerCSR = 4, + PlatformCSR = 5, + ResellerHelpdesk = 6, + PlatformHelpdesk = 7 } } diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/Common/SecurityContext.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/Common/SecurityContext.cs index fd457ab1..bd037cd7 100644 --- a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/Common/SecurityContext.cs +++ b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/Common/SecurityContext.cs @@ -45,6 +45,10 @@ namespace WebsitePanel.EnterpriseServer public const string ROLE_ADMINISTRATOR = "Administrator"; public const string ROLE_RESELLER = "Reseller"; public const string ROLE_USER = "User"; + public const string ROLE_PLATFORMCSR = "PlatformCSR"; + public const string ROLE_PLATFORMHELPDESK = "PlatformHelpdesk"; + public const string ROLE_RESELLERCSR = "ResellerCSR"; + public const string ROLE_RESELLERHELPDESK = "ResellerHelpdesk"; public const string CONTEXT_USER_INFO = "CONTEXT_USER_INFO"; @@ -62,8 +66,26 @@ namespace WebsitePanel.EnterpriseServer // set roles array List roles = new List(); roles.Add(SecurityContext.ROLE_USER); + + if (user.Role == UserRole.Reseller || user.Role == UserRole.Administrator || + user.Role == UserRole.PlatformHelpdesk || user.Role == UserRole.ResellerHelpdesk) + roles.Add(SecurityContext.ROLE_RESELLERHELPDESK); + + if (user.Role == UserRole.Reseller || user.Role == UserRole.Administrator || + user.Role == UserRole.PlatformCSR || user.Role == UserRole.ResellerCSR) + roles.Add(SecurityContext.ROLE_RESELLERCSR); + + if (user.Role == UserRole.Reseller || user.Role == UserRole.Administrator || + user.Role == UserRole.PlatformHelpdesk) + roles.Add(SecurityContext.ROLE_PLATFORMHELPDESK); + + if (user.Role == UserRole.Reseller || user.Role == UserRole.Administrator || + user.Role == UserRole.PlatformCSR) + roles.Add(SecurityContext.ROLE_PLATFORMCSR); + if (user.Role == UserRole.Reseller || user.Role == UserRole.Administrator) roles.Add(SecurityContext.ROLE_RESELLER); + if (user.Role == UserRole.Administrator) roles.Add(SecurityContext.ROLE_ADMINISTRATOR); @@ -152,9 +174,40 @@ namespace WebsitePanel.EnterpriseServer { // should make a check if the account has Admin role if (!User.IsInRole(ROLE_RESELLER)) - return BusinessErrorCodes.ERROR_USER_ACCOUNT_SHOULD_BE_RESELLER; + return BusinessErrorCodes.ERROR_USER_ACCOUNT_NOT_ENOUGH_PERMISSIONS; } + if ((demand & DemandAccount.IsPlatformCSR) == DemandAccount.IsPlatformCSR) + { + // should make a check if the account has Admin role + if (!User.IsInRole(ROLE_PLATFORMCSR)) + return BusinessErrorCodes.ERROR_USER_ACCOUNT_NOT_ENOUGH_PERMISSIONS; + } + + if ((demand & DemandAccount.IsPlatformHelpdesk) == DemandAccount.IsPlatformHelpdesk) + { + // should make a check if the account has Admin role + if (!User.IsInRole(ROLE_PLATFORMHELPDESK)) + return BusinessErrorCodes.ERROR_USER_ACCOUNT_NOT_ENOUGH_PERMISSIONS; + } + + + if ((demand & DemandAccount.IsResellerHelpdesk) == DemandAccount.IsResellerHelpdesk) + { + // should make a check if the account has Admin role + if (!User.IsInRole(ROLE_RESELLERHELPDESK)) + return BusinessErrorCodes.ERROR_USER_ACCOUNT_NOT_ENOUGH_PERMISSIONS; + } + + + if ((demand & DemandAccount.IsResellerCSR) == DemandAccount.IsResellerCSR) + { + // should make a check if the account has Admin role + if (!User.IsInRole(ROLE_RESELLERCSR)) + return BusinessErrorCodes.ERROR_USER_ACCOUNT_NOT_ENOUGH_PERMISSIONS; + } + + return 0; } diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/Packages/PackageController.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/Packages/PackageController.cs index d336dfa0..7b2b322d 100644 --- a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/Packages/PackageController.cs +++ b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/Packages/PackageController.cs @@ -399,7 +399,7 @@ namespace WebsitePanel.EnterpriseServer // check account result.Result = SecurityContext.CheckAccount(DemandAccount.NotDemo | DemandAccount.IsActive - | DemandAccount.IsReseller); + | DemandAccount.IsResellerCSR); if (result.Result < 0) return result; // check if domain exists @@ -652,7 +652,7 @@ namespace WebsitePanel.EnterpriseServer { // check account result.Result = SecurityContext.CheckAccount(DemandAccount.NotDemo | DemandAccount.IsActive - | DemandAccount.IsReseller); + | DemandAccount.IsResellerCSR); if (result.Result < 0) return result; int packageId = -1; diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/App_Data/WebsitePanel_Pages.config b/WebsitePanel/Sources/WebsitePanel.WebPortal/App_Data/WebsitePanel_Pages.config index d9a76036..be8e97cf 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/App_Data/WebsitePanel_Pages.config +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/App_Data/WebsitePanel_Pages.config @@ -9,25 +9,25 @@
    -