Completed
Pull Request — master (#68)
by
unknown
14:02
created

KerberosAuth   A

Complexity

Total Complexity 15

Size/Duplication

Total Lines 68
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 0

Test Coverage

Coverage 0%

Importance

Changes 0
Metric Value
wmc 15
lcom 1
cbo 0
dl 0
loc 68
ccs 0
cts 12
cp 0
rs 10
c 0
b 0
f 0

8 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 3 1
A getUsername() 0 3 1
A getWorkgroup() 0 3 1
A getPassword() 0 3 1
A getExtraCommandLineArguments() 0 3 1
A setExtraSmbClientOptions() 0 4 1
A registerApacheKerberosTicket() 0 28 5
A __destruct() 0 5 4
1
<?php
2
/**
3
 * @copyright Copyright (c) 2018 Robin Appelman <[email protected]>
4
 *
5
 * @license GNU AGPL version 3 or any later version
6
 *
7
 * This program is free software: you can redistribute it and/or modify
8
 * it under the terms of the GNU Affero General Public License as
9
 * published by the Free Software Foundation, either version 3 of the
10
 * License, or (at your option) any later version.
11
 *
12
 * This program is distributed in the hope that it will be useful,
13
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15
 * GNU Affero General Public License for more details.
16
 *
17
 * You should have received a copy of the GNU Affero General Public License
18
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
19
 *
20
 */
21
22
namespace Icewind\SMB;
23
24
/**
25
 * Use existing kerberos ticket to authenticate
26
 */
27
class KerberosAuth implements IAuth {
28
        
29
	private $ticketPath = "";
30
31
	//not working with nextcloud
32
        private $saveTicketInMemory = false;
33
34
	public function __construct() {
35
		$this->registerApacheKerberosTicket();
36
	}
37
38
	public function getUsername() {
39
		return 'dummy';
40
	}
41
42
	public function getWorkgroup() {
43
		return 'dummy';
44
	}
45
46
	public function getPassword() {
47
		return null;
48
	}
49
50
	public function getExtraCommandLineArguments() {
51
		return '-k';
52
	}
53
54
	public function setExtraSmbClientOptions($smbClientState) {
55
		smbclient_option_set($smbClientState, SMBCLIENT_OPT_USE_KERBEROS, true);
56
		smbclient_option_set($smbClientState, SMBCLIENT_OPT_FALLBACK_AFTER_KERBEROS, false);
57
	}
58
59
	private function registerApacheKerberosTicket() {
60
		// inspired by https://git.typo3.org/TYPO3CMS/Extensions/fal_cifs.git
61
	 
62
		if (!extension_loaded("krb5")) {
63
			return;
64
		}
65
		//read apache kerberos ticket cache
66
		$cacheFile = getenv("KRB5CCNAME");
67
		if(!$cacheFile) {
68
			return;
69
		}
70
		$krb5 = new \KRB5CCache();
71
		$krb5->open($cacheFile);
72
		if(!$krb5->isValid()) {
73
			return;
74
		}
75
		if($this->saveTicketInMemory) {
76
			putenv("KRB5CCNAME=" . $krb5->getName());
77
		}
78
		else {
79
			//workaround: smbclient is not working with the original apache ticket cache.
80
			$tmpFilename = tempnam("/tmp", "krb5cc_php_");
81
			$tmpCacheFile = "FILE:" . $tmpFilename;
82
			$krb5->save($tmpCacheFile);
83
			$this->ticketPath = $tmpFilename;
84
			putenv("KRB5CCNAME=" . $tmpCacheFile);
85
		}
86
	}
87
	
88
	public function __destruct() {
89
		if(!empty($this->ticketPath) && file_exists($this->ticketPath)  && is_file($this->ticketPath)) {
90
			   unlink($this->ticketPath);
91
		}
92
	}
93
94
}
95