From cadeafd496bc39d538b60bb11e870012b6768df0 Mon Sep 17 00:00:00 2001 From: Roland Gruber Date: Wed, 12 Feb 2014 19:39:51 +0000 Subject: [PATCH] added NIS attributes for Windows --- lam/HISTORY | 1 + lam/docs/manual-sources/howto.xml | 16 ++- .../images/mod_windowsGroup4.png | Bin 0 -> 8087 bytes .../images/mod_windowsUser5.png | Bin 19977 -> 20214 bytes lam/lib/modules/windowsGroup.inc | 94 +++++++++++++++++- lam/lib/modules/windowsUser.inc | 94 +++++++++++++++++- 6 files changed, 199 insertions(+), 6 deletions(-) create mode 100644 lam/docs/manual-sources/images/mod_windowsGroup4.png diff --git a/lam/HISTORY b/lam/HISTORY index cb372c2c..e1daa99d 100644 --- a/lam/HISTORY +++ b/lam/HISTORY @@ -2,6 +2,7 @@ March 2014 4.5 - IMAP: allow dynamic admin user names by replacing wildcards with LDAP attributes - Personal: allow to set fields read-only - Added option to server profile if referrals should be followed (fixes problems with Samba 4 and AD) + - Windows user/group: NIS support (msSFU30NisDomain, msSFU30Name) - LAM Pro: -> Allow to set single account types read-only -> Support for organizationalRole entries diff --git a/lam/docs/manual-sources/howto.xml b/lam/docs/manual-sources/howto.xml index 58f19d0f..2ed1123c 100644 --- a/lam/docs/manual-sources/howto.xml +++ b/lam/docs/manual-sources/howto.xml @@ -1713,7 +1713,7 @@ Have fun! - Samba 4: + Samba 4/Active Directory: Account types: @@ -2601,6 +2601,9 @@ Have fun! domain names and if pre-Windows 2000 user names should be managed. + NIS support is deactivated by default. Enable it if + needed. + @@ -3360,6 +3363,17 @@ Have fun! + NIS support is deactivated by default. Enable it if needed on + tab "Module settings". + + + + + + + + + Now you can edit your groups inside LAM. You can manage the group name, description and its type. Of course, you can also set the group members. diff --git a/lam/docs/manual-sources/images/mod_windowsGroup4.png b/lam/docs/manual-sources/images/mod_windowsGroup4.png new file mode 100644 index 0000000000000000000000000000000000000000..310188f8208475db2e490a16dd77eb577ca1e8ee GIT binary patch literal 8087 zcma)h2UHW^w{BDvMUf^&ni7y6kd9R8y+}1wA%rSjdR0WJLAul+2uN2T36KDa^xk`s z-U+>zJO2K6t^2?CzV+T)S;?H4IWswD@3X)C?eBzZYbp^F(Gr0`AYv6|c^wewx+2i_ zzkMC}z42>h?C-%{Rz>gj?b{QxT7Q7kJ1)vlcMym)9r$`&D{ys-1%V!ksmROdd8cnq z`ItO7xFXy>>fGS@ZgPF@EnygV>4gsyIe{``7?{?qz?3l&KC?D5qEl3MP=YI|EVC=H zn+urD2s4`Y$}M2>{*%Z~)WEp0)#)D?R9s4c{caM`v3@eD)D^fSAb|A2mpWT73GB^& zev<+Wg)!(n#|bz-Uwp250|X*`n{W#Rx__O67zCmx(4hr^L~nl;1c6*gmF+;FKaW54 zgFruJ*g31tr*GunXRQ56!wd#@s}eiF6|Ctr@`5T=m?WslCVyN|P`;)Efd<)46fzmh z9b5X2>gyQ$^X~Amwy9gIC#Cp1zq5i`M{Q9~^Ts|*nc+`qi?V_yEd~u*sCSRpw|RT) z;i{-0sd{sz*FnLsqTUzdWrX}-afu5ze3B1sj!K+@N)pQ$OM7;!e0Yldi?|eaz84AV zP?Uvwb$ zNqr|#!ldQUIzY24^uhn1<_PT`s@Xr9&)mU#yZ@nJ64WS1@#s|&+$cvtHO~9WYDp4e zq-c)wZrb(y-TXk)7Uw!}U#+bv($J_fiWRJBYm!&X?hpV1eaqzZhD7`Lik_TSx!|}v z)cKJf32+tgo{w_#U3KlJb5B&LqFMW1eUe|D=2kqSs`k>{y$n}E?B6syISF##k4YHD zj<_3RHhtaq)s`^go*Rx+V%{x?+MQZ#sv7$B)EIDE{yibz4bY%ErJ7yT$&mZe!BRj# zEx}vfL9+MEmS6QKCu=;G_mQc_L3cUXV)7vNH*aFUWmx6Bofn-GMTE_-1QL=XMCZaD z5Xt1~q-&f-E(Cq8Jf1dX)3}@oNl2X!2w9;D;@Z9_6rQ+s0(aT*K z5_Y?oWL|S>g22UyX8{zxq_OM~u<1({pWmLD%lYbzHqa364hrduwT~wqThm>5`f;b( zcMmTwiO2J9>>HY2%F{wE(cC*tJin-aN}?$Ha5n}{xBpB$`@ zw25Mll1+>9dXA@cPKwHw{d{~fwPun7_F_gySG1(hBElMwt5r653-EZ*ANCek!uyPD z+2%*|zQWlQWW@A>zJTp+*6hcy;x5+0j<{&lfrS&+Ud^i!w*Y=p-srZhRpxPI39*SE z50@AmY&53$RCmzu;cEu<(aODB?m`IVKcX)Z4)U(QNO+=>1cVX%ut!c1OisWgR=8I> zMHptQv^G7;_(J}{1hW{tg%LcCI(weH@>GU2g8N`|<4V|>vDMXN<~<{8ye*GOT%~8@ z_OH^?wX7^wfxMvC1?ThG`oBLM>K2&}+9y+ge6lrOiwtY{ExtA7_de`Cz34O-&(hDg zF!@TGp4rw`ZSd~?erw0T?RTG!{d@K+B@@ZiKp^(~!kVFRZ=PsViKc3@`S6`a(YR-p z-I~dCLyTU<%i9Ut&WOM`eaI>DgF9{+(KaZs{XJKzuMYajp^alh4bPjBeqtOXARwjk|9ls?u zH#buf6E)ClC+rqKoimVMZ;;o-BqWn6j5DHPpdm15Q(mW zGYYM6w0_^r;W5da_nbEvL69O?`1785NQJ6jG@`5iO%xk{>l-ztYp9isKX%#bQGCsR zA+1ebfn>18E0SK?qL4*}kR;2-ixZgE=#_G$HIwdR(Hb$Vy&`@n`M@x z*fhu&sXyffS1R_?s_^#5PiL6iq=qKZFtf&UQ$WRcl;wAJOhuf=$>`|d9O2Q?)0w+P zLlp=#?qI1SlB#TYbw8QMGys2bWz?<|O<&Gpm!X+Ivbrw~fl|;<4w^7BG6L5eU%n&+ z6Wv|^gtNe&$kLLb>?tbj53FB25a2Zz%6|?5dFvIj%K{*tiy^WVWijxENM-N1R|>x4$61jk#f`Lc|nFfhGv@Vb*n86=WTs4H9%Cv zh@jH6E}FGI%165$e1k26hkFw3_MBLG19LQ#uX;cC*^40gg=CXP|HOD;50w{wVTX4l z@{_&H`A)g(g@RsVZs)pA^j#Rf39^rlvI4)g_rZn^I^v6nNT0-4moYQfTwS$%eztf6 z^t^gi5HoN!nTb1&exJNtQ*$<65q6N^>3xJ7W}rZB2)1VGZ=Xvy$DFKZSK+^^JK-Y5 z@!6L4BB2hB$s2pzXOmk}5D|>C^jeldjTKJeT^%~&W_+p7?^$|0XZX#fI;JQ-R)OYT zCPq+}qAvDCg7Wk_8N-=JpjDY`?l7A%$7XY)v@A?VEb#^qONKG5*OyFD|3B-UlYUftp-i$^GHS+VfPov?R(y&da=U~!j?$drU%E=xZR&acL zTiFejX1^Yfgu4v6Oh{lgKh&31t&q6NS2LdmF-i0*0%JBJJ;FPRR+@xt?Dq* z)S`&5>Efvp(V5GU_X7c9sr`;9w{lu?9CtXzo8N8rph|XiU8bdp&^eq87RRmD_?cTx zohm%Mkp@Q2m!e!F^2;hSMY3IviM2i8fyiepd17p4*eb@yj(+!{%n z5-PS*%xx3}VFg?DkaKgeB~fU$uCnaj(%Zul3J@r`)j)MVtis4_l0u6>YKOp$1bC6J zurn&Dgt!3+Ty4iOb-V0>KNe_!<7bJ=u*)H1I3Her0G#ODCSp6|V$KEJfwI1W%Kc^g z--fNQO1*y}`~R~bcnmxq9P+OU!a_2aL*Fwx`L8tsUTWFVf6Ng9aJBQX$A9(tSCx@{ zFDF!Xs5*n!%9@KNHpuY@8e99D9jF=zSVM-pQx ze!dmDc(nQouXGy(vR1YuNteo)F4XUpn@I2esbMnj&eY-aoMwG8osz~1%9^W#`_vSu zd@y>6?WnZCm}ZR1Igo&U&UY`N1kXtJxl?Z`jB#>E75OjfbGrUq`8XCF?%*$YvoMCD zAiT_0@L>q8=uHu~UAM)x5laffJB*sUevtu%H9%kwrRywO2Eo%fqF=xnAEj$u<&uvW zC`2j7!)prZa0enI?jspUl12Q2n#TH$#=7`adkz<-?YF+|BHrq0yDQTgU3DSqqiInk z5Y$8TEy-W#=H=FQY@e-=DeTN^S%3I&aQCj3`t&Euf>%Z9VRb2}Z*t1W-tU3B`CSwW zedP_5Tp~(}Bt%48pfZbLZe-8e=nrhDZzB_1g}ul_WvwMDloyL^mhR#cg_0MVB_in=q*DmZ8kdEvy%h zxTlqzl~q2pf|@cD#l4zVTVJ}r?UE+u$T%g$A>geJ_xn=T3%M|fB6uQC z1u9ThbJ0SAwN(2LT!i6EBrf3jl_+Zb$>XfqW7ixth?Y_6B-Svhq9Q&y+2*P-Q!Q@T z*g8OLCxcak)|Gyw#Nj==(du!X^(MOR&XkEsx~WO}*}I0f@MG3;+6RzELWhzdx?jydGMY_|oy`AjcyFy^z!8 zyTqv)#VDV31)1-0pJ85Y2Us^y2@O_(Oy<*uuu^fl{tVq z501W<87v&)V_wxjhw>V!gw7nn#E%MrS2DKhIyneUTtahjA>$BXX`lnSrAEFDyGNjm+ zx6<)(A8L;?FD7Uu*aHLHBFxOQMyQL8uiRg~f^`)0vR>fVhUmmH0>^fvHz!cS)HT%w z0{r~=$u^Yx69bQ!0K1Oiscd#LY+%m&bCKhe^NEx4kExx!UN&tC?6xcL!bR1jhN7{# zZ64aQBWh6Ahl!eF;Q6)!>puP!>H zRw*`ShJmY4=$OT9c#r(Pv5AnR9=fo|1t8P2}9(O-_sh#(Ckcz9TvnP=1qCaq#wRD1Tl?1=Qjh9B?D6)uGRYV{$|)bA z_cX0(X|fWmDl`pynW@Od{@^$GKve1mh@Iw29h*k*+XR2&dU zUw(1HItV_&q0#Wv6a?B9{S~hCR}>R&R@2oR^0xcirSVjN@!1!Np1{|%G)`KmJ?g_m z*rE`bqY zsVAlb6r*UQzH9l9G=$O#Z+)(RwU|e|$5jzP2^0EC8SY+PA2E<0jZf<>@uuUZppAAq zje3O6-)L*AUSBrEn9poE!e$vM^6MA?|T9~-z2HEsKU8@vZrr062AL%l={r@I*)wu+NR(G zGE6F$NzI!B)Ck-AP&TyfiOJDuGEf6!xL-EdJ3^jB%(Wmpft*E6mH8RR)TA?G;4_f* zEk{Yqb8Ye{^b7v8+J8@dO@6hCx}F=vf#5u!$j@dw%m_wFsH}y4*eW^Nr-P?s0*S$| zl2488qTho`UsgZk_tn;Rq4vA3DPLjDYd^y$bv|}YE!mNsKB$QA2W3B)$Gq;c%uC9z z&=IJ17|uq_mj?!To0@BNs$^x}&ZdN2df}In#ibPPF%F(#tJT!LeRnweb?w5>*SF^G zyFZJI&)gcb^ouZ5Wd_5bq*Hx1y4YgwMAST53JOiCKlQb+eOYhdSVO{axP@|nF6~BK zH9LmV(tltV>;1!jcE~W1So3D`qjS{7D>udFT*><4bV-M~<AUWyHxyV^|oXfI|(z zFgD6ow+`5;(k26)Wb{8XZqg~bJ>0gby$eXBX?%_nWF`M20k`gkJlZ>K9IIf>l+4&& zTCsQ(m8JvOY-Nhex@+7q3DefbQ9D=jayp6hXEdEIH6-10t1RP?!2ck%M8wGoKYFR# zuO*ONHfjY8FZrB6+TURI=%TNFI`E|R%fjerE3jN{-Ms1T&y$AI#? zK_;84t95?MSZ;bI<+5<6|Z*kt%H7LQw-ogL;X zjr{fMy#7eBs=5H{5l!0Ucf;Cg{Atk2Cj!)XQ#0!$peF%L07lpSm0Jxbkk`%3=>NZj1Bv6U*)Ct%A@utDs8;?5M?f( z7)c2%HtNmOB;chbL<9K}K-(vA1nZ3(P8qOpslhj^O0+xy zR|ZhjR9A@t(&o|n#QdKx6iHCZt7v0lp~2@vaJ_YM&B&25yqY{`VqDnTaEU3dA)F#V zXv+P#A+#g^QXLjGR;^H^22ASo*gGZP7 zOIus^nTPvtI=Z`mbQT^vPa1stl2^c^WcNgyopHewF(1)sit_C^gVh(C&v+dd-ALj& z8SnNOuSn3blboUE;GL9EiR(E}v0R;XTk7$nCa;nAny&GgC4`xayKEnSZJSBdeyQNw zxi_=5TNELTg2=83zuK?lK>O-sh&z^ZL`zH%-G#zy=PQlE_ z%RMmc5hJBD-_PSps0=d9TurICO(;hMYLtDTH*Ce<+yNBB{DIXnlM}!G1VX|Lw56qu zGMmQ9)>795!0G@@w8)r9xw}5N6Yej(kP~C`27g$bmNtI*IH7Gt`iu8pW_FcU z!6LAi+QwoHhx4i!nJ=L0;}Y?7YG`KYDrXgtA;x}%%#E<+uN>U;4fs`aAWe8n7+oQ` zh@b(Y^+|4GujE%NUDkl7_%ryXcyrKGr}kE|8(dX-Gw+=wdK5e!PUhpk9Z&P+CQSC66!H2?HoI!+)!2*0Bw;x|nY@!DeZ~LyQp?|v zntC~`_3dvnU+3pnnMo8f|4en>SFxqJmYjV2Xr(V6HtpM{BLxuR3qk~m&zG1BGIlQ1 zID8>Yrm15lU|By`XQzGphhyd%8S*K=xOo2iElAUUpXA#cbLHjbzZ)o!;VVIFdgGJN z4q5Zvlq zO?L@_d}>DI}|;zcWNPXi4 z167+dt_gKJR+tJi+cgkKPh@D(zyTnWMH|wMvVi;&Y~OWx*W%x|UjJQb`Ct51&s?m_ z5tSB`kyw&1$Yyg??2yk{rUJZgF*eX1Yd(+mG(byLskeNKZHqKxQyPa%0JD07d8jwB7uFowI1z6=C{z(Xq_vW59wS Okcxt)e5vfKcmDy$ywM~8 literal 0 HcmV?d00001 diff --git a/lam/docs/manual-sources/images/mod_windowsUser5.png b/lam/docs/manual-sources/images/mod_windowsUser5.png index b6148cd66fc1954f49806671ede740f65d38d7ee..8077ed56b5faf722c6f72e1cf3fcd829fecfae6f 100644 GIT binary patch literal 20214 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 e0NVAxj~m;LOL<{&0eSzG{ku2 array( @@ -138,6 +139,14 @@ class windowsGroup extends baseModule { "Headline" => _('Managed by'), 'attr' => 'managedBy', "Text" => _('The group is managed by this contact person.') ), + 'msSFU30Name' => array( + "Headline" => _('NIS name'), 'attr' => 'msSFU30Name', + "Text" => _('Group name for NIS.') + ), + 'msSFU30NisDomain' => array( + "Headline" => _('NIS domain'), 'attr' => 'msSFU30NisDomain', + "Text" => _('NIS domain name.') + ), ); // configuration settings $configContainer = new htmlTable(); @@ -149,6 +158,8 @@ class windowsGroup extends baseModule { $configContainerOptions->addElement(new htmlTableExtendedInputCheckbox('windowsGroup_hidemail', false, _('Email address'), null, false)); $configContainerOptions->addElement(new htmlOutputText(' ')); $configContainerOptions->addElement(new htmlTableExtendedInputCheckbox('windowsGroup_hidemanagedBy', false, _('Managed by'), null, false)); + $configContainerOptions->addElement(new htmlTableExtendedInputCheckbox('windowsGroup_hidemsSFU30Name', true, _('NIS name'), null, false)); + $configContainerOptions->addElement(new htmlTableExtendedInputCheckbox('windowsGroup_hidemsSFU30NisDomain', true, _('NIS domain'), null, false)); $configContainer->addElement($configContainerOptions, true); $return['config_options']['all'] = $configContainer; // upload fields @@ -211,6 +222,29 @@ class windowsGroup extends baseModule { 'example' => 'cn=user1,o=test', ); } + if (!$this->isBooleanConfigOptionSet('windowsGroup_hidemsSFU30Name', true)) { + $return['upload_columns'][] = array( + 'name' => 'windowsGroup_msSFU30Name', + 'description' => _('NIS name'), + 'help' => 'msSFU30Name', + 'example' => _('adminstrators'), + ); + } + if (!$this->isBooleanConfigOptionSet('windowsGroup_hidemsSFU30NisDomain', true)) { + $return['upload_columns'][] = array( + 'name' => 'windowsGroup_msSFU30NisDomain', + 'description' => _('NIS domain'), + 'help' => 'msSFU30NisDomain', + 'example' => _('domain'), + ); + } + // profile options + if (!$this->isBooleanConfigOptionSet('windowsGroup_hidemsSFU30NisDomain', true)) { + $profileContainer = new htmlTable(); + $profileContainer->addElement(new htmlTableExtendedInputField(_('NIS domain'), 'windowsGroup_msSFU30NisDomain', null, 'msSFU30NisDomain'), true); + $return['profile_options'] = $profileContainer; + $return['profile_mappings']['windowsGroup_msSFU30NisDomain'] = 'msSFU30NisDomain'; + } // available PDF fields $return['PDF_fields'] = array( 'cn' => _('Group name'), @@ -226,6 +260,12 @@ class windowsGroup extends baseModule { if (!$this->isBooleanConfigOptionSet('windowsGroup_hidemanagedBy')) { $return['PDF_fields']['managedBy'] = _('Managed by'); } + if (!$this->isBooleanConfigOptionSet('windowsGroup_hidemsSFU30Name', true)) { + $return['PDF_fields']['msSFU30Name'] = _('NIS name'); + } + if (!$this->isBooleanConfigOptionSet('windowsGroup_hidemsSFU30NisDomain', true)) { + $return['PDF_fields']['msSFU30NisDomain'] = _('NIS domain'); + } return $return; } @@ -239,6 +279,8 @@ class windowsGroup extends baseModule { $this->messages['mail'][1] = array('ERROR', _('Account %s:') . ' windowsGroup_mail', _('Please enter a valid email address!')); $this->messages['groupScope'][0] = array('ERROR', _('Account %s:') . ' windowsGroup_groupScope', _('Please enter a valid group scope.')); $this->messages['groupType'][0] = array('ERROR', _('Account %s:') . ' windowsGroup_groupType', _('Please enter a valid group type.')); + $this->messages['msSFU30Name'][0] = array('ERROR', _('NIS name'), _('NIS name contains invalid characters. Valid characters are: a-z, A-Z, 0-9 and .-_ !')); + $this->messages['msSFU30Name'][1] = array('ERROR', _('Account %s:') . ' windowsGroup_msSFU30Name', _('NIS name contains invalid characters. Valid characters are: a-z, A-Z, 0-9 and .-_ !')); } /** @@ -316,6 +358,17 @@ class windowsGroup extends baseModule { } $container->addElement($managedByButtons, true); } + // NIS + if (!$this->isBooleanConfigOptionSet('windowsGroup_hidemsSFU30Name', true) || !$this->isBooleanConfigOptionSet('windowsGroup_hidemsSFU30NisDomain', true)) { + $container->addElement(new htmlSubTitle(_('NIS')), true); + if (!$this->isBooleanConfigOptionSet('windowsGroup_hidemsSFU30Name', true)) { + $this->addSimpleInputTextField($container, 'msSFU30Name', _('NIS name')); + } + if (!$this->isBooleanConfigOptionSet('windowsGroup_hidemsSFU30NisDomain', true)) { + $this->addSimpleInputTextField($container, 'msSFU30NisDomain', _('NIS domain')); + } + $container->addVerticalSpace('20px'); + } // group members $container->addElement(new htmlSpacer(null, '10px'), true); $container->addElement(new htmlOutputText(_("Group members"))); @@ -389,6 +442,22 @@ class windowsGroup extends baseModule { unset($this->attributes['managedBy']); } } + // NIS name + if (!$this->isBooleanConfigOptionSet('windowsGroup_hidemsSFU30Name', true)) { + if ($this->getAccountContainer()->isNewAccount && !isset($this->attributes['msSFU30Name']) && empty($_POST['msSFU30Name'])) { + $this->attributes['msSFU30Name'][0] = $_POST['cn']; + } + else { + $this->attributes['msSFU30Name'][0] = $_POST['msSFU30Name']; + } + if (!empty($this->attributes['msSFU30Name'][0]) && !get_preg($this->attributes['msSFU30Name'][0], 'groupname')) { + $return[] = $this->messages['msSFU30Name'][0]; + } + } + // NIS domain + if (!$this->isBooleanConfigOptionSet('windowsGroup_hidemsSFU30Name', true)) { + $this->attributes['msSFU30NisDomain'][0] = $_POST['msSFU30NisDomain']; + } return $return; } @@ -658,6 +727,25 @@ class windowsGroup extends baseModule { else { $partialAccounts[$i]['groupType'] = $partialAccounts[$i]['groupType'] - 2147483648; } + // NIS name + if (!$this->isBooleanConfigOptionSet('windowsGroup_hidemsSFU30Name', true)) { + if (!empty($rawAccounts[$i][$ids['windowsGroup_msSFU30Name']])) { + if (get_preg($rawAccounts[$i][$ids['windowsGroup_msSFU30Name']], 'groupname')) { + $partialAccounts[$i]['msSFU30Name'] = $rawAccounts[$i][$ids['windowsGroup_msSFU30Name']]; + } + else { + $errMsg = $this->messages['msSFU30Name'][1]; + array_push($errMsg, array($i)); + $errors[] = $errMsg; + } + } + } + // NIS domain + if (!$this->isBooleanConfigOptionSet('windowsGroup_hidemsSFU30NisDomain', true)) { + if (!empty($rawAccounts[$i][$ids['windowsGroup_msSFU30NisDomain']])) { + $partialAccounts[$i]['msSFU30NisDomain'] = $rawAccounts[$i][$ids['windowsGroup_msSFU30NisDomain']]; + } + } } return $errors; } @@ -671,6 +759,8 @@ class windowsGroup extends baseModule { $this->addSimplePDFField($return, 'description', _('Description')); $this->addSimplePDFField($return, 'info', _('Notes')); $this->addSimplePDFField($return, 'mail', _('Email address')); + $this->addSimplePDFField($return, 'msSFU30Name', _('NIS name')); + $this->addSimplePDFField($return, 'msSFU30NisDomain', _('NIS domain')); // group type $groupType = windowsGroup::TYPE_SECURITY; $groupScope = windowsGroup::SCOPE_GLOBAL; diff --git a/lam/lib/modules/windowsUser.inc b/lam/lib/modules/windowsUser.inc index a9e539d7..f27e6e44 100644 --- a/lam/lib/modules/windowsUser.inc +++ b/lam/lib/modules/windowsUser.inc @@ -88,7 +88,7 @@ class windowsUser extends baseModule implements passwordService { $return['attributes'] = array('userPrincipalName', 'cn', 'sAMAccountName', 'description', 'displayName', 'givenName', 'initials', 'l', 'mail', 'otherTelephone', 'physicalDeliveryOfficeName', 'postalCode', 'postOfficeBox', 'sn', 'st', 'streetAddress', 'telephoneNumber', 'url', 'wWWHomePage', 'userAccountControl', 'profilePath', 'scriptPath', - 'pwdLastSet', 'otherMailbox', 'homeDirectory', 'homeDrive'); + 'pwdLastSet', 'otherMailbox', 'homeDirectory', 'homeDrive', 'msSFU30Name', 'msSFU30NisDomain'); // help Entries $return['help'] = array( 'cn' => array( @@ -241,6 +241,14 @@ class windowsUser extends baseModule implements passwordService { "Text" => _('UNC-path (\\\\server\\share\) of home directory. If no home drive is set then this directory must start with a drive letter (e.g. "c:\dir\user").') . ' ' . _('You can use "$user", "$firstname" and "$lastname" as wildcards for user name, first and last name.') ), + 'msSFU30Name' => array( + "Headline" => _('NIS name'), 'attr' => 'msSFU30Name', + "Text" => _('User name for NIS.') + ), + 'msSFU30NisDomain' => array( + "Headline" => _('NIS domain'), 'attr' => 'msSFU30NisDomain', + "Text" => _('NIS domain name.') + ), ); // upload fields $return['upload_columns'] = array( @@ -437,6 +445,22 @@ class windowsUser extends baseModule implements passwordService { 'unique' => true, ); } + if (!$this->isBooleanConfigOptionSet('windowsUser_hidemsSFU30Name', true)) { + $return['upload_columns'][] = array( + 'name' => 'windowsUser_msSFU30Name', + 'description' => _('NIS name'), + 'help' => 'msSFU30Name', + 'example' => _('smiller'), + ); + } + if (!$this->isBooleanConfigOptionSet('windowsUser_hidemsSFU30NisDomain', true)) { + $return['upload_columns'][] = array( + 'name' => 'windowsUser_msSFU30NisDomain', + 'description' => _('NIS domain'), + 'help' => 'msSFU30NisDomain', + 'example' => _('domain'), + ); + } // profile options $profileContainer = new htmlTable(); $profileContainer->addElement(new htmlTableExtendedInputField(_('Common name'), 'windowsUser_cn', null, 'cn'), true); @@ -446,6 +470,9 @@ class windowsUser extends baseModule implements passwordService { $profileContainer->addElement(new htmlTableExtendedInputField(_('Logon script'), 'windowsUser_scriptPath', null, 'scriptPath'), true); $profileContainer->addElement(new htmlTableExtendedInputField(_('Profile path'), 'windowsUser_profilePath', null, 'profilePath'), true); $profileContainer->addElement(new htmlTableExtendedInputField(_('Home directory'), 'windowsUser_homeDirectory', null, 'homeDirectory'), true); + if (!$this->isBooleanConfigOptionSet('windowsUser_hidemsSFU30NisDomain', true)) { + $profileContainer->addElement(new htmlTableExtendedInputField(_('NIS domain'), 'windowsUser_msSFU30NisDomain', null, 'msSFU30NisDomain'), true); + } $return['profile_options'] = $profileContainer; // profile mappings $return['profile_mappings'] = array( @@ -456,6 +483,9 @@ class windowsUser extends baseModule implements passwordService { 'windowsUser_profilePath' => 'profilePath', 'windowsUser_homeDirectory' => 'homeDirectory', ); + if (!$this->isBooleanConfigOptionSet('windowsUser_hidemsSFU30NisDomain', true)) { + $return['profile_mappings']['windowsUser_msSFU30NisDomain'] = 'msSFU30NisDomain'; + } // available PDF fields $return['PDF_fields'] = array( 'userPrincipalName' => _('User name'), @@ -491,6 +521,12 @@ class windowsUser extends baseModule implements passwordService { if (!$this->isBooleanConfigOptionSet('windowsUser_hidesAMAccountName', true)) { $return['PDF_fields']['sAMAccountName'] = _('User name (pre W2K)'); } + if (!$this->isBooleanConfigOptionSet('windowsUser_hidemsSFU30Name', true)) { + $return['PDF_fields']['msSFU30Name'] = _('NIS name'); + } + if (!$this->isBooleanConfigOptionSet('windowsUser_hidemsSFU30NisDomain', true)) { + $return['PDF_fields']['msSFU30NisDomain'] = _('NIS domain'); + } // self service search attributes $return['selfServiceSearchAttributes'] = array('sAMAccountName'); // self service field settings @@ -520,6 +556,8 @@ class windowsUser extends baseModule implements passwordService { $configContainer->addElement($configHiddenGroup, true); $configContainerOptions = new htmlTable(); $configContainerOptions->addElement(new htmlTableExtendedInputCheckbox('windowsUser_hidesAMAccountName', true, _('User name (pre W2K)'), null, false)); + $configContainerOptions->addElement(new htmlTableExtendedInputCheckbox('windowsUser_hidemsSFU30Name', true, _('NIS name'), null, false)); + $configContainerOptions->addElement(new htmlTableExtendedInputCheckbox('windowsUser_hidemsSFU30NisDomain', true, _('NIS domain'), null, false)); $configContainer->addElement($configContainerOptions, true); $return['config_options']['all'] = $configContainer; return $return; @@ -572,6 +610,8 @@ class windowsUser extends baseModule implements passwordService { $this->messages['homeDrive'][0] = array('ERROR', _('Account %s:') . ' windowsUser_homeDrive', _('Please enter a valid drive letter.')); $this->messages['homeDirectory'][0] = array('ERROR', _('Home directory'), _('Homedirectory contains invalid characters.')); $this->messages['homeDirectory'][1] = array('ERROR', _('Account %s:') . ' windowsUser_homeDirectory', _('Homedirectory contains invalid characters.')); + $this->messages['msSFU30Name'][0] = array('ERROR', _('NIS name'), _('NIS name contains invalid characters. Valid characters are: a-z, A-Z, 0-9 and .-_ !')); + $this->messages['msSFU30Name'][1] = array('ERROR', _('Account %s:') . ' windowsUser_msSFU30Name', _('NIS name contains invalid characters. Valid characters are: a-z, A-Z, 0-9 and .-_ !')); } /** @@ -718,9 +758,20 @@ class windowsUser extends baseModule implements passwordService { } $containerLeft->addElement(new htmlTableExtendedSelect('homeDrive', $drives, $selected, _('Home drive'), 'homeDrive'), true); // home directory - $this->addSimpleInputTextField($containerLeft, 'homeDirectory', _('Home directory')); + $this->addSimpleInputTextField($containerLeft, 'homeDirectory', _('Home directory'), true); - $containerLeft->addElement(new htmlEqualWidth(array('streetAddress', 'cn'))); + // NIS attributes + if (!$this->isBooleanConfigOptionSet('windowsUser_hidemsSFU30Name', true) || !$this->isBooleanConfigOptionSet('windowsUser_hidemsSFU30NisDomain', true)) { + $containerLeft->addElement(new htmlSubTitle(_('NIS')), true); + if (!$this->isBooleanConfigOptionSet('windowsUser_hidemsSFU30Name', true)) { + $this->addSimpleInputTextField($containerLeft, 'msSFU30Name', _('NIS name')); + } + if (!$this->isBooleanConfigOptionSet('windowsUser_hidemsSFU30NisDomain', true)) { + $this->addSimpleInputTextField($containerLeft, 'msSFU30NisDomain', _('NIS domain')); + } + } + + $containerLeft->addElement(new htmlEqualWidth(array('streetAddress', 'cn')), true); $containerRight = new htmlTable(); $containerRight->alignment = htmlElement::ALIGN_TOP; @@ -935,6 +986,22 @@ class windowsUser extends baseModule implements passwordService { if (!empty($this->attributes['homeDrive'][0]) && !get_preg($this->attributes['homeDirectory'][0], 'UNC')) { $return[] = $this->messages['homeDirectory'][0]; } + // NIS name + if (!$this->isBooleanConfigOptionSet('windowsUser_hidemsSFU30Name', true)) { + if ($this->getAccountContainer()->isNewAccount && !isset($this->attributes['msSFU30Name']) && empty($_POST['msSFU30Name'])) { + $this->attributes['msSFU30Name'][0] = $_POST['userPrincipalName']; + } + else { + $this->attributes['msSFU30Name'][0] = $_POST['msSFU30Name']; + } + if (!empty($this->attributes['msSFU30Name'][0]) && !get_preg($this->attributes['msSFU30Name'][0], 'username')) { + $return[] = $this->messages['msSFU30Name'][0]; + } + } + // NIS domain + if (!$this->isBooleanConfigOptionSet('windowsUser_hidemsSFU30Name', true)) { + $this->attributes['msSFU30NisDomain'][0] = $_POST['msSFU30NisDomain']; + } return $return; } @@ -1407,6 +1474,25 @@ class windowsUser extends baseModule implements passwordService { _('LAM was unable to find a group with this name!') . '
' . htmlspecialchars(implode('; ', $invalidGroups))); } } + // NIS name + if (!$this->isBooleanConfigOptionSet('windowsUser_hidemsSFU30Name', true)) { + if (!empty($rawAccounts[$i][$ids['windowsUser_msSFU30Name']])) { + if (get_preg($rawAccounts[$i][$ids['windowsUser_msSFU30Name']], 'username')) { + $partialAccounts[$i]['msSFU30Name'] = $rawAccounts[$i][$ids['windowsUser_msSFU30Name']]; + } + else { + $errMsg = $this->messages['msSFU30Name'][1]; + array_push($errMsg, array($i)); + $errors[] = $errMsg; + } + } + } + // NIS domain + if (!$this->isBooleanConfigOptionSet('windowsUser_hidemsSFU30NisDomain', true)) { + if (!empty($rawAccounts[$i][$ids['windowsUser_msSFU30NisDomain']])) { + $partialAccounts[$i]['msSFU30NisDomain'] = $rawAccounts[$i][$ids['windowsUser_msSFU30NisDomain']]; + } + } } return $errors; } @@ -1551,6 +1637,8 @@ class windowsUser extends baseModule implements passwordService { $this->addSimplePDFField($return, 'telephoneNumber', _('Telephone number')); $this->addSimplePDFField($return, 'url', _('Other web sites')); $this->addSimplePDFField($return, 'wWWHomePage', _('Web site')); + $this->addSimplePDFField($return, 'msSFU30Name', _('NIS name')); + $this->addSimplePDFField($return, 'msSFU30NisDomain', _('NIS domain')); $deactivated = _('no'); if ($this->isDeactivated($this->attributes)) { $deactivated = _('yes');