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

KerberosAuth::__destruct()   A

Complexity

Conditions 4
Paths 2

Size

Total Lines 5

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 20

Importance

Changes 0
Metric Value
dl 0
loc 5
ccs 0
cts 0
cp 0
rs 10
c 0
b 0
f 0
cc 4
nc 2
nop 0
crap 20
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