forked from icecoder/ICEcoder
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathgithub.php
More file actions
276 lines (235 loc) · 8.56 KB
/
github.php
File metadata and controls
276 lines (235 loc) · 8.56 KB
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
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
<?php
include("headers.php");
include("settings.php");
$t = $text['github'];
// SSL check, as everything is over https
$wrappers = stream_get_wrappers();
$sslAvail = true;
if (!extension_loaded('openssl') || !in_array('https', $wrappers)) {
$sslAvail = false;
echo "<script>top.ICEcoder.message('".$t['Sorry, you do...']."');top.ICEcoder.showHide('hide',top.get('loadingMask'));</script>";
die();
}
// If we have an action to perform
if (!$demoMode && isset($_SESSION['loggedIn']) && $_SESSION['loggedIn'] && isset($_GET['action']) && $sslAvail) {
// ====
// AUTH
// ====
if ($_GET['action']=="auth") {
$_SESSION['githubAuthToken'] = xssClean($_GET['token'],"html");
echo '<!DOCTYPE html>
<html>
<head>
<script src="github.js?microtime=<?php echo microtime(true);?>"></script>
</body>
<script>
top.ICEcoder.githubAuthTokenSet = true;
goNext = "'.xssClean($_GET['goNext'],"html").'";
if (goNext=="showManager") {
top.ICEcoder.githubManager();
}
if (goNext=="loadFiles") {
top.ICEcoder.githubDiffToggle();
}
</script>
</body>
</html>';
}
// ====
// READ
// ====
if ($_GET['action']=="read") {
echo '<!DOCTYPE html>
<html>
<head>
<script src="github.js?microtime=<?php echo microtime(true);?>"></script>
<script src="underscore-min.js?microtime=<?php echo microtime(true);?>"></script>
</body>
<script>
// Start our github object, establish this repo & file path
var github = new Github({token: "'.$_SESSION['githubAuthToken'].'", auth: "oauth"});
var thisRepo = "'.$_GET['repo'].'";
var thisFilePath = "'.$_GET['filePath'].'";
// Start our repo and read the data in, then update diff pane with that
var repo = github.getRepo(thisRepo.split("|")[0], thisRepo.split("|")[1]);
repo.read("master", thisFilePath.replace(/\|/g,"/"), function(err, data) {
if (err) {
top.ICEcoder.message("There has been an error trying to get that file from GitHub.\n\nGitHub response:\n"+err);
} else {
cMdiff = top.ICEcoder.getcMdiffInstance();
cMdiff.setValue(data);
}
});
</script>
</body>
</html>';
}
// =====
// CLONE
// =====
if ($_GET['action']=="clone") {
$iceGithubLocalPaths = $ICEcoder["githubLocalPaths"];
$iceGithubRemotePaths = $ICEcoder["githubRemotePaths"];
$pathPos = array_search($iceRoot,$iceGithubLocalPaths);
if ($pathPos !== false) {
// USE: https://github.com/mattpass/ICEcoder/zipball/master
// Store the plugin zip to the tmp dir
$target = $docRoot.$iceGithubLocalPaths[$pathPos]."/";
$zipURL = $iceGithubRemotePaths[$pathPos].'/zipball/master';
$zipFile = "../tmp/".basename($zipURL);
if (ini_get('allow_url_fopen')) {
$fileData = file_get_contents($zipURL, false, $context);
} elseif (function_exists('curl_init')) {
$client = curl_init($zipURL);
curl_setopt($client, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($client, CURLOPT_RETURNTRANSFER, 1); //fixed this line
$fileData = curl_exec($client);
}
file_put_contents($zipFile, $fileData);
// Now unpack the zip
$zip = new ZipArchive;
$zip->open($zipFile);
// Create all files & dirs, in 1kb chunks
for($i=0; $i<$zip->numFiles; $i++) {
$name = $zip->getNameIndex($i);
if ($i==0) {
$dirName = $name;
} else {
$tgtName = str_replace($dirName,"",$name);
// Determine output filename
$file = $target.$tgtName;
// Create the directories if necessary
$dir = dirname($file);
if (!is_dir($dir)) mkdir($dir, 0777, true);
// Read from zip and write to disk
$fpr = $zip->getStream($name);
if (!is_dir($file)) {
$fpw = fopen($file, 'w');
while ($data = fread($fpr, 1024)) {
fwrite($fpw, $data);
}
fclose($fpw);
}
fclose($fpr);
}
}
$zip->close();
// Remove the tmp zip file
unlink($zipFile);
// Refresh the file manager
echo "<script>top.ICEcoder.refreshFileManager();</script>";
}
}
// ======
// COMMIT
// ======
if ($_GET['action']=="commit") {
?>
<!DOCTYPE html>
<html onContextMenu="return false">
<head>
<title>ICEcoder <?php echo $ICEcoder["versionNo"];?> GitHub commit files</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta name="robots" content="noindex, nofollow">
<script src="github.js?microtime=<?php echo microtime(true);?>"></script>
<link rel="stylesheet" type="text/css" href="github.css?microtime=<?php echo microtime(true);?>">
</head>
<body class="githubAction">
<h1><?php
$action = xssClean($_GET['action'],"html");
echo $action == "commit" ? "Commit files" : "Pull files"; ?></h1>
<form name="commitDetails">
Title:<br><input type="text" name="commitTitle" id="commitTitle" value="" style="width: 300px; margin: 5px 0 15px 0" maxlength="50"><br>
Message:<br><textarea name="commitMessage" id="commitMessage" style="width: 300px; height: 118px; margin: 5px 0 15px 0"></textarea>
</form>
<div style="display: inline-block; padding: 5px; background: #2187e7; color: #fff; font-size: 12px; cursor: pointer" onclick="top.ICEcoder.showHide('show',top.get('loadingMask'));commitFiles()">Commit</div>
<br><br>
<?php
// Get file contents for selected files
$selectedFiles = xssClean($_GET['selectedFiles'],"html");
$selectedFiles = explode(";",$selectedFiles);
for ($i=0; $i<count($selectedFiles); $i++) {
// Replace pipes with slashes
$file = str_replace("|","/",$selectedFiles[$i]);
// Trim any +'s or spaces from the end of file
$file = rtrim(rtrim($file,'+'),' ');
// Establish the real absolute path to the file
$file = str_replace("\\","/",realpath($docRoot.$iceRoot.$file));
// Only get the file if it exists and begins with our $docRoot
if (file_exists($file) && strpos($file,$docRoot) === 0) {
$loadedFile = toUTF8noBOM(file_get_contents($file,false,$context),true);
echo '<textarea name="loadedFile'.$i.'" id="loadedFile'.$i.'" style="display: none">'.str_replace("</textarea>","<ICEcoder:/:textarea>",str_replace("&","&",$loadedFile)).'</textarea><br><br>'.PHP_EOL.PHP_EOL;
} else {
die("<script>alert('Sorry, that file doesn\'t appear to exist');</script>");
}
}
?>
<script>
// Start our github object
var github = new Github({token: "<?php echo $_SESSION['githubAuthToken'];?>", auth: "oauth"});
committingFiles = ['<?php
$cF = implode("','", $selectedFiles);
echo $cF;
?>'];
seqFile = 0;
commitFiles = function() {
// Commit our files one after another
var repo = github.getRepo(top.repo.split("/")[0], top.repo.split("/")[1]);
repo.write(
'master',
committingFiles[seqFile].substr(1).replace(/\|/g,"/"),
document.getElementById('loadedFile'+seqFile).value,
document.getElementById('commitTitle').value+'\n\n'+document.getElementById('commitMessage').value,
function(err) {
if (!err) {
var locSplit = committingFiles[seqFile].lastIndexOf("|");
var location = committingFiles[seqFile].substr(0,locSplit+1);
var file = committingFiles[seqFile].substr(locSplit+1);
// Splice from diff or deleted paths
if (top.diffPaths.indexOf(committingFiles[seqFile].substr(1).replace(/\|/g,"/")) > -1) {
top.diffPaths.splice(top.diffPaths.indexOf(committingFiles[seqFile].substr(1).replace(/\|/g,"/")),1);
}
if (top.deletedPaths.indexOf(committingFiles[seqFile].substr(1).replace(/\|/g,"/")) > -1) {
top.deletedPaths.splice(top.deletedPaths.indexOf(committingFiles[seqFile].substr(1).replace(/\|/g,"/")),1);
}
// Then deselect and remove from file manager
top.ICEcoder.thisFileFolderLink = committingFiles[seqFile];
top.ICEcoder.selectFileFolder(false,'ctrlSim');
top.ICEcoder.updateFileManagerList("delete",location,file);
seqFile++;
// If there's another file to do
if (top.ICEcoder.selectedFiles.length > 0) {
commitFiles();
} else {
top.ICEcoder.showHide('hide',top.get('loadingMask'));
top.ICEcoder.showHide('hide',top.get('blackMask'));
if (top.diffPaths.length == 0 && top.deletedPaths.length == 0) {
top.ICEcoder.message('All done, switching modes');
top.ICEcoder.githubDiffToggle();
}
}
} else {
top.ICEcoder.message('There was an error with committing.\n\nSee dev tools console for details.');
console.log(err);
}
}
);
}
</script>
</body>
</html>
<?php
}
// ====
// PULL
// ====
if ($_GET['action']=="pull") {
?>
<script>
top.ICEcoder.showHide('hide',top.get('blackMask'));
top.ICEcoder.message("Pull actions not yet available. Will be in available soon!");
</script>
<?php
}
}
?>