WordPress.org

Make WordPress Core

Ticket #9452: plugin-editor.php

File plugin-editor.php, 8.0 KB (added by bingorabbit, 6 years ago)

Just a fix for calling files that don't need to be editted using a GET request in the URL

Line 
1<?php
2/**
3 * Edit plugin editor administration panel.
4 *
5 * @package WordPress
6 * @subpackage Administration
7 */
8
9/** WordPress Administration Bootstrap */
10require_once('admin.php');
11
12$title = __("Edit Plugins");
13$parent_file = 'plugins.php';
14
15wp_reset_vars(array('action', 'redirect', 'profile', 'error', 'warning', 'a', 'file', 'plugin'));
16
17wp_admin_css( 'theme-editor' );
18
19$plugins = get_plugins();
20
21if ( empty($plugin) ) {
22        $plugin = array_keys($plugins);
23        $plugin = $plugin[0];
24}
25
26$plugin_files = get_plugin_files($plugin);
27
28if (empty($file))
29        $file = $plugin_files[0];
30
31$file = validate_file_to_edit($file, $plugin_files);
32$real_file = WP_PLUGIN_DIR . '/' . $file;
33
34switch($action) {
35
36case 'update':
37
38        check_admin_referer('edit-plugin_' . $file);
39
40        if ( !current_user_can('edit_plugins') )
41                wp_die('<p>'.__('You do not have sufficient permissions to edit templates for this blog.').'</p>');
42
43        $newcontent = stripslashes($_POST['newcontent']);
44        if ( is_writeable($real_file) ) {
45                $f = fopen($real_file, 'w+');
46                fwrite($f, $newcontent);
47                fclose($f);
48
49                // Deactivate so we can test it.
50                if ( is_plugin_active($file) || isset($_POST['phperror']) ) {
51                        if ( is_plugin_active($file) )
52                                deactivate_plugins($file, true);
53                        wp_redirect(add_query_arg('_wpnonce', wp_create_nonce('edit-plugin-test_' . $file), "plugin-editor.php?file=$file&liveupdate=1"));
54                        exit;
55                }
56                wp_redirect("plugin-editor.php?file=$file&a=te");
57        } else {
58                wp_redirect("plugin-editor.php?file=$file");
59        }
60        exit;
61
62break;
63
64default:
65
66        if ( !current_user_can('edit_plugins') )
67                wp_die('<p>'.__('You do not have sufficient permissions to edit plugins for this blog.').'</p>');
68
69        if ( isset($_GET['liveupdate']) ) {
70                check_admin_referer('edit-plugin-test_' . $file);
71
72                $error = validate_plugin($file);
73                if( is_wp_error($error) )
74                        wp_die( $error );
75
76                if ( ! is_plugin_active($file) )
77                        activate_plugin($file, "plugin-editor.php?file=$file&phperror=1");// we'll override this later if the plugin can be included without fatal error
78
79                wp_redirect("plugin-editor.php?file=$file&a=te");
80                exit;
81        }
82
83        wp_enqueue_script( 'codepress' );
84        add_action( 'admin_print_footer_scripts', 'codepress_footer_js' );
85        require_once('admin-header.php');
86
87        update_recently_edited(WP_PLUGIN_DIR . '/' . $file);
88
89        if ( ! is_file($real_file) )
90                $error = 1;
91
92        if ( ! $error ) {
93                $content = file_get_contents( $real_file );
94
95                if ( '.php' == substr( $real_file, strrpos( $real_file, '.' ) ) ) {
96                        $functions = wp_doc_link_parse( $content );
97
98                        $docs_select = '<select name="docs-list" id="docs-list">';
99                        $docs_select .= '<option value="">' . __( 'Function Name...' ) . '</option>';
100                        foreach ( $functions as $function) {
101                                $docs_select .= '<option value="' . urlencode( $function ) . '">' . htmlspecialchars( $function ) . '()</option>';
102                        }
103                        $docs_select .= '</select>';
104                }
105
106                $content = htmlspecialchars( $content );
107                $codepress_lang = codepress_get_lang($real_file);
108        }
109        ?>
110<?php if (isset($_GET['a'])) : ?>
111 <div id="message" class="updated fade"><p><?php _e('File edited successfully.') ?></p></div>
112<?php elseif (isset($_GET['phperror'])) : ?>
113 <div id="message" class="updated fade"><p><?php _e('This plugin has been deactivated because your changes resulted in a <strong>fatal error</strong>.') ?></p>
114        <?php
115                if ( wp_verify_nonce($_GET['_error_nonce'], 'plugin-activation-error_' . $file) ) { ?>
116        <iframe style="border:0" width="100%" height="70px" src="<?php bloginfo('wpurl'); ?>/wp-admin/plugins.php?action=error_scrape&amp;plugin=<?php echo attribute_escape($file); ?>&amp;_wpnonce=<?php echo attribute_escape($_GET['_error_nonce']); ?>"></iframe>
117        <?php } ?>
118</div>
119<?php endif; ?>
120<div class="wrap">
121<?php screen_icon(); ?>
122<h2><?php echo wp_specialchars( $title ); ?></h2>
123<div class="bordertitle">
124        <form id="themeselector" action="plugin-editor.php" method="post">
125                <strong><label for="theme"><?php _e('Select plugin to edit:'); ?> </label></strong>
126                <select name="plugin" id="plugin">
127<?php
128        foreach ($plugins as $plugin_key => $a_plugin) {
129        $plugin_name = $a_plugin['Name'];
130        if ($plugin_key == $plugin) $selected = " selected='selected'";
131        else $selected = '';
132        $plugin_name = attribute_escape($plugin_name);
133        echo "\n\t<option value=\"$plugin_key\" $selected>$plugin_name</option>";
134}
135?>
136                </select>
137                <input type="submit" name="Submit" value="<?php _e('Select') ?>" class="button" />
138        </form>
139</div>
140<div class="tablenav">
141<div class="alignleft">
142<big><?php
143        if ( is_plugin_active($plugin) ) {
144                if ( is_writeable($real_file) )
145                        echo sprintf(__('Editing <strong>%s</strong> (active)'), $file);
146                else
147                        echo sprintf(__('Browsing <strong>%s</strong> (active)'), $file);
148        } else {
149                if ( is_writeable($real_file) )
150                        echo sprintf(__('Editing <strong>%s</strong> (inactive)'), $file);
151                else
152                        echo sprintf(__('Browsing <strong>%s</strong> (inactive)'), $file);
153        }
154        ?></big>
155</div>
156<br class="clear" />
157</div>
158<br class="clear" />
159        <div id="templateside">
160        <h3 id="bordertitle"><?php _e('Plugin Files'); ?></h3>
161
162        <ul>
163<?php foreach($plugin_files as $plugin_file) :
164        // Get the extension of the file.
165    $ext = substr($plugin_file, strpos($plugin_file, '.') + 1);
166    // List of included files
167    $include = array("php", "txt", "css", "html");
168    /*if( false !== array_search($ext, $exclude)) continue; ?>*/
169    if( false === array_search($ext, $include) ) continue; ?>
170       
171                <li<?php echo $file == $plugin_file ? ' class="highlight"' : ''; ?>><a href="plugin-editor.php?file=<?php echo $plugin_file; ?>&plugin=<?php echo $plugin; ?>"><?php echo $plugin_file ?></a></li>
172<?php endforeach; ?>
173        </ul>
174        </div>
175<?php   if ( ! $error ) { ?>
176        <form name="template" id="template" action="plugin-editor.php" method="post">
177        <?php wp_nonce_field('edit-plugin_' . $file) ?>
178        <?php
179            // Get the extension of the file.
180        echo $plugin;
181        $ext = substr($file, strpos($file, '.') + 1);
182        // List of included files
183        $include = array("php", "html", "css", "txt");
184        if( false === array_search($ext, $include) ) :
185            echo ("You can't edit this file.");
186            break;
187           endif;
188        ?>
189                <div><textarea cols="70" rows="25" name="newcontent" id="newcontent" tabindex="1" class="codepress <?php echo $codepress_lang ?>"><?php echo $content ?></textarea>
190                <input type="hidden" name="action" value="update" />
191                <input type="hidden" name="file" value="<?php echo $file ?>" />
192                <input type="hidden" name="plugin" value="<?php echo $plugin ?>" />
193                </div>
194                <?php if ( count( $functions ) ) : ?>
195                <div id="documentation"><label for="docs-list">Documentation:</label> <?php echo $docs_select ?> <input type="button" class="button" value=" <?php _e( 'Lookup' ) ?> " onclick="if ( '' != jQuery('#docs-list').val() ) { window.open( 'http://api.wordpress.org/core/handbook/1.0/?function=' + escape( jQuery( '#docs-list' ).val() ) + '&locale=<?php echo urlencode( get_locale() ) ?>&version=<?php echo urlencode( $wp_version ) ?>&redirect=true'); }" /></div>
196                <?php endif; ?>
197<?php if ( is_writeable($real_file) ) : ?>
198        <?php if ( in_array($file, (array) get_option('active_plugins')) ) { ?>
199                <p><?php _e('<strong>Warning:</strong> Making changes to active plugins is not recommended.  If your changes cause a fatal error, the plugin will be automatically deactivated.'); ?></p>
200        <?php } ?>
201        <p class="submit">
202        <?php
203                if ( isset($_GET['phperror']) )
204                        echo "<input type='hidden' name='phperror' value='1' /><input type='submit' name='submit' class='button-primary' value='" . __('Update File and Attempt to Reactivate') . "' tabindex='2' />";
205                else
206                        echo "<input type='submit' name='submit' class='button-primary' value='" . __('Update File') . "' tabindex='2' />";
207        ?>
208        </p>
209<?php else : ?>
210        <p><em><?php _e('You need to make this file writable before you can save your changes. See <a href="http://codex.wordpress.org/Changing_File_Permissions">the Codex</a> for more information.'); ?></em></p>
211<?php endif; ?>
212 </form>
213<?php
214        } else {
215                echo '<div class="error"><p>' . __('Oops, no such file exists! Double check the name and try again, merci.') . '</p></div>';
216        }
217?>
218<div class="clear"> &nbsp; </div>
219</div>
220<?php
221        break;
222}
223include("admin-footer.php") ?>