summaryrefslogtreecommitdiffstats
path: root/apps/files_external/lib/smb_oc.php
blob: 0c79c06c5df13863b68d295c4466f5d04234ae87 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
<?php
/**
 * Copyright (c) 2014 Robin McCorkell <rmccorkell@karoshi.org.uk>
 * This file is licensed under the Affero General Public License version 3 or
 * later.
 * See the COPYING-README file.
 */

namespace OC\Files\Storage;

require_once __DIR__ . '/../3rdparty/smb4php/smb.php';

class SMB_OC extends \OC\Files\Storage\SMB {
	private $username_as_share;

	public function __construct($params) {
		if (isset($params['host']) && \OC::$session->exists('smb-credentials')) {
			$host=$params['host'];
			$this->username_as_share = ($params['username_as_share'] === 'true');

			$params_auth = \OC::$session->get('smb-credentials');
			$user = \OC::$session->get('loginname');
			$password = $params_auth['password'];

			$root=isset($params['root'])?$params['root']:'/';
			$share = '';

			if ($this->username_as_share) {
				$share = '/'.$user;
			} elseif (isset($params['share'])) {
				$share = $params['share'];
			} else {
				throw new \Exception();
			}
			parent::__construct(array(
				"user" => $user,
				"password" => $password,
				"host" => $host,
				"share" => $share,
				"root" => $root
			));
		} else {
			throw new \Exception();
		}
	}

	public static function login( $params ) {
		\OC::$session->set('smb-credentials', $params);
	}

	public function isSharable($path) {
		return false;
	}

	public function test($isPersonal = true) {
		if ($isPersonal) {
			if ($this->stat('')) {
				return true;
			}
			return false;
		} else {
			$smb = new \smb();
			$pu = $smb->parse_url($this->constructUrl(''));

			// Attempt to connect anonymously
			$pu['user'] = '';
			$pu['pass'] = '';

			// Share cannot be checked if dynamic
			if ($this->username_as_share) {
				if ($smb->look($pu)) {
					return true;
				} else {
					return false;
				}
			}
			if (!$pu['share']) {
				return false;
			}

			// The following error messages are expected due to anonymous login
			$regexp = array(
				'(NT_STATUS_ACCESS_DENIED)' => 'skip'
			) + $smb->getRegexp();

			if ($smb->client("-d 0 " . escapeshellarg('//' . $pu['host'] . '/' . $pu['share']) . " -c exit", $pu, $regexp)) {
				return true;
			} else {
				return false;
			}
		}
	}
}