Re: some thoughts about accessing smb shares

Stephan Lauffer <[email protected]> Fri, 24 Feb 2012 14:56:06 +0100
Newsgroups gmane.comp.horde.gollem
Message-ID <[email protected]>
...found an error... subdirs were not accessible, sorry.

:/

btw... the diff is againts horde 4.0.13.


Am 24.02.2012 14:42, schrieb Stephan Lauffer:
> Hi Jan, hello others!
>
> Am 24.02.2012 11:32, schrieb Jan Schneider:
>>
>> Zitat von Stephan Lauffer <[email protected]>:
>>
>>> Hello!
>>>
>>> Thank you for gollem! :)
>>>
>>> Ok... I think about mounting the so called homeDirectory of a windows
>>> user account into the filemanager, into gollem.
>>>
>>> Since we have a lot of different servers, paths it is not possible to
>>> get this working with static informations in backends.local.php.
>>>
>>> Right now I would like to ask a directory (via) ldap for this path. I
>>> think this would match for the most cases.
>>>
>>> My question is: Do you like this idea? What different ideas do you have?
>>>
>>> (and yes I'd like to code this feature if there is a goog chance to
>>> become this upstream afterwards).
>>
>> That sounds far too specific to be integrated upstream, but nothing
>> speaks against implementing this locally in your configuration file
>>
>
> Thank you for your fast response!
>
> Ok... I think nearly every windows domain user has a homedirectory but
> as you explained: It may be to specific for the most horde installations
> and so (poorly for mee) it will not go upstream.
>
> My question now is: Could you please be so kind and take a short look at
> my patch?
>
> Since I am new to the horde world I am realy not sure if the place and
> way how I patched it is done well. :-/
>
> My idea right now is...:
>
> [1] changes on gollem/config/backends.local.php
>
> Three new params for the smb backend: shareLdapURI (and optional
> shareLdapDN, shareLdapPW for non anonymous binds) to query the Microsoft
> ADS (or other ldap servers). The format of shareLdapURI is very close to
> the well known one from Apache called AuthLDAPURL.
>
> example:
>
> 'shareLdapURI' =>
> 'ldap://123.123.123.123/?ou=users,dc=my,dc=foobar,dc=com?samAccountname?homeDirectory',
>
> 'shareLdapDN' => 'cn=foo bar,dc=my,dc=foobar,dc=com',
> 'shareLdapPW' => 'MySecret',
>
> So we search for homeDirectory where samAccountname=horde-use in the
> search base "ou=users,dc=my,dc=foobar,dc=com" at our domain controller
> 123.123.123.123.
>
> So if there is a defined shareLdapURI in our backend config than...
>
> [2] changes on pear/php/Horde/Vfs/Smb.php
>
> Test if there is a homeDirectory path found in the DS. If not, fall back
> to the already known "share" params.
>
> Now... I don't know if this is a good place to things like this in
> Smb.php. And... maybe I had to take an horde specific ldap class...? How
> should I handle errors or warnings?
>
> It would be very helpfully for my to know what you think...
>
> Thank you!
>
> (may I should ask my question on the devel list...?)
>
>
>


-- 
Freundliche Gruesse,
Stephan Lauffer

[ University of Education Freiburg - Germany ]
[ http://www.ph-freiburg.de/zik/             ]
[ Fon/ Fax: +49 761 682 -559/ -486           ]

-- 
Gollem mailing list
Frequently Asked Questions: http://horde.org/faq/
To unsubscribe, mail: [email protected]
Smb.php-shareLdapURI.patch (text/plain, 2.1 KB)
--- pear/php/Horde/Vfs/Smb-orig.php	2012-02-24 14:03:17.000000000 +0100
+++ pear/php/Horde/Vfs/Smb.php	2012-02-24 14:52:50.000000000 +0100
@@ -626,3 +626,51 @@
     {
-        list($share) = $this->_escapeShellCommand($this->_params['share']);
+	$share = NULL;
+
+	if (isset($this->_params['shareLdapURI'])) {
+
+		# Test if param shareLdapURI is set.
+		# If true query LDAP server for the share to mount.
+		# If shareLdapURI is unset we will take the data from 'share'
+
+		$ldap_share_path = mb_split("\?", $this->_params['shareLdapURI']);
+
+		$ds = @ldap_connect($ldap_share_path[0]);
+		if (!$ds)  {
+			throw new Horde_Vfs_Exception("LDAP connection error");
+		}
+
+		if (isset($this->_params['shareLdapDN']) && isset($this->_params['shareLdapPW'])) {
+			$lb = @ldap_bind( 	$ds,	
+						$this->_params['shareLdapDN'],
+						$this->_params['shareLdapPW']);
+		} else {
+			$lb = @ldap_bind($ds);
+		}	
+
+		if (!$lb) {
+			throw new Horde_Vfs_Exception(ldap_error($ds));
+		}
+
+		$justthese = array($ldap_share_path[3]);
+		$sr = ldap_list(	$ds,
+					$ldap_share_path[1],
+					$ldap_share_path[2] . "=" . $this->_params['username'],
+					$justthese);
+		$result = ldap_get_entries($ds, $sr);
+	
+		if ($ds) @ldap_unbind($ds);
+
+		if ($result['count']==1) {
+			$share = $result[0][$ldap_share_path[3]][0];
+			$splitarr = preg_split('/\\\/',$share);
+
+			$netshare = '//'.implode('/',array_slice($splitarr,2,2));
+			$path = implode('/',array_slice($splitarr,4)) . '/' . $path;
+		}
+	}
+	if (!isset($share)) { 
+		list($share) = $this->_escapeShellCommand($this->_params['share']);
+		$netshare = '//' . $this->_params['hostspec'] . '/' . $share;
+	}
+	
         putenv('PASSWD=' . $this->_params['password']);
@@ -630,5 +678,6 @@
         $fullcmd = $this->_params['smbclient'] .
-            ' "//' . $this->_params['hostspec'] . '/' . $share . '"' .
+            ' "' . $netshare . '"' .
             ' "-p' . $this->_params['port'] . '"' .
             ' "-U' . $this->_params['username'] . '"' .
+            ' "-W' . $this->_params['domain'] . '"' .
             ' -D "' . $path . '" ' .
smime.p7s (application/pkcs7-signature, 4.8 KB) - not displayed