PluginProbe
User Access Manager / 2.1.7
User Access Manager v2.1.7
2.3.20 2.3.19 2.3.18 2.3.17 2.3.16 2.3.15 2.3.14 2.3.13 trunk 0.6 0.6.1 0.6.2 0.7 0.7 Beta 0.7.0.1 0.8 0.8.0.1 0.8.0.2 0.9 0.9.1 0.9.1.1 0.9.1.2 0.9.1.3 0.9.1.4 1.0 All 136 releases
user-access-manager / src / File / ApacheFileProtection.php

ApacheFileProtection.php in User Access Manager 2.1.7, at src/File/ApacheFileProtection.php

193 lines 5.3 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 /**
3 * ApacheFileProtection.php
4 *
5 * The ApacheFileProtection class file.
6 *
7 * PHP versions 5
8 *
9 * @author Alexander Schneider <alexanderschneider85@gmail.com>
10 * @copyright 2008-2017 Alexander Schneider
11 * @license http://www.gnu.org/licenses/gpl-2.0.html GNU General Public License, version 2
12 * @version SVN: $id$
13 * @link http://wordpress.org/extend/plugins/user-access-manager/
14 */
15 namespace UserAccessManager\File;
16
17 use UserAccessManager\Object\ObjectHandler;
18
19 /**
20 * Class ApacheFileProtection
21 *
22 * @package UserAccessManager\FileHandler
23 */
24 class ApacheFileProtection extends FileProtection implements FileProtectionInterface
25 {
26 const FILE_NAME = '.htaccess';
27
28 /**
29 * Returns the file types.
30 *
31 * @return null|string
32 */
33 private function getFileTypes()
34 {
35 $fileTypes = null;
36 $lockedFileTypes = $this->mainConfig->getLockedFileType();
37
38 if ($lockedFileTypes === 'selected') {
39 $fileTypes = $this->cleanUpFileTypes($this->mainConfig->getLockedFiles());
40 $fileTypes = ($fileTypes !== '') ? "\.({$fileTypes})" : null;
41 } elseif ($lockedFileTypes === 'not_selected') {
42 $fileTypes = $this->cleanUpFileTypes($this->mainConfig->getNotLockedFiles());
43 $fileTypes = ($fileTypes !== '') ? "^\.({$fileTypes})" : null;
44 }
45
46 return $fileTypes;
47 }
48
49 /**
50 * Returns the directory match.
51 *
52 * @return null|string
53 */
54 protected function getDirectoryMatch()
55 {
56 if ($this->mainConfig->getLockedDirectoryType() === 'wordpress') {
57 return '^.*'.DIRECTORY_SEPARATOR.parent::getDirectoryMatch().'.*$';
58 }
59
60 return parent::getDirectoryMatch();
61 }
62
63 /**
64 * @param string $content
65 *
66 * @return string
67 */
68 private function applyFilters($content)
69 {
70 $fileTypes = $this->getFileTypes();
71
72 if ($fileTypes !== null) {
73 /** @noinspection */
74 $content = "<FilesMatch '{$fileTypes}'>\n{$content}</FilesMatch>\n";
75 }
76
77 return $content;
78 }
79
80 /**
81 * Creates the file content if no permalinks are active.
82 *
83 * @param string $directory
84 *
85 * @return string
86 */
87 private function getFileContent($directory)
88 {
89 $areaName = 'WP-Files';
90 // make .htaccess and .htpasswd
91 $content = "AuthType Basic"."\n";
92 $content .= "AuthName \"{$areaName}\""."\n";
93 $content .= "AuthUserFile {$directory}.htpasswd"."\n";
94 $content .= "require valid-user"."\n";
95
96 return $this->applyFilters($content);
97 }
98
99 /**
100 * Creates the file content if permalinks are active.
101 *
102 * @param string $objectType
103 *
104 * @return string
105 */
106 private function getPermalinkFileContent($objectType)
107 {
108 if ($objectType === null) {
109 $objectType = ObjectHandler::ATTACHMENT_OBJECT_TYPE;
110 }
111
112 $homeRoot = parse_url($this->wordpress->getHomeUrl());
113 $homeRoot = (isset($homeRoot['path']) === true) ? '/'.trim($homeRoot['path'], '/\\').'/' : '/';
114
115 $content = "RewriteEngine On\n";
116 $content .= "RewriteBase {$homeRoot}\n";
117 $content .= "RewriteRule ^index\\.php$ - [L]\n";
118
119 $directoryMatch = $this->getDirectoryMatch();
120
121 if ($directoryMatch !== null) {
122 $content .= "RewriteCond %{REQUEST_URI} {$directoryMatch}\n";
123 }
124
125 $content .= "RewriteRule ^([^?]*)$ {$homeRoot}index.php?uamfiletype={$objectType}&uamgetfile=$1 [QSA,L]\n";
126 $content .= "RewriteRule ^(.*)\\?(((?!uamfiletype).)*)$ ";
127 $content .= "{$homeRoot}index.php?uamfiletype={$objectType}&uamgetfile=$1&$2 [QSA,L]\n";
128 $content .= "RewriteRule ^(.*)\\?(.*)$ {$homeRoot}index.php?uamgetfile=$1&$2 [QSA,L]\n";
129 $content = $this->applyFilters($content);
130
131 $content = "<IfModule mod_rewrite.c>\n$content</IfModule>\n";
132
133 return $content;
134 }
135
136 /**
137 * Returns the htaccess file name with path.
138 *
139 * @param null|string $directory
140 *
141 * @return string
142 */
143 public function getFileNameWithPath($directory = null)
144 {
145 return $directory.self::FILE_NAME;
146 }
147
148 /**
149 * Generates the htaccess file.
150 *
151 * @param string $directory
152 * @param string $objectType
153 *
154 * @return bool
155 */
156 public function create($directory, $objectType = null)
157 {
158 $directory = rtrim($directory, '/').'/';
159
160 if ($this->wordpress->gotModRewrite() === false) {
161 $content = $this->getFileContent($directory);
162 $this->createPasswordFile(true, $directory);
163 } else {
164 $content = $this->getPermalinkFileContent($objectType);
165 }
166
167 // save files
168 $fileWithPath = $this->getFileNameWithPath($directory);
169
170 try {
171 file_put_contents($fileWithPath, $content);
172 return true;
173 } catch (\Exception $exception) {
174 // Because file_put_contents can throw exceptions we use this try catch block
175 // to return the success result instead of an exception
176 }
177
178 return false;
179 }
180
181 /**
182 * Deletes the htaccess files.
183 *
184 * @param string $directory
185 *
186 * @return bool
187 */
188 public function delete($directory)
189 {
190 return $this->deleteFiles($directory);
191 }
192 }
193