Skip to content

Commit 40f5135

Browse files
authored
Merge pull request #1144 from codeborne/allow-status-request-only-with-status-key
use "application.statusKey" instead of "application.secret" …
2 parents 1094543 + 15874d0 commit 40f5135

File tree

9 files changed

+75
-80
lines changed

9 files changed

+75
-80
lines changed

documentation/commands/cmd-status.txt

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
~
99
~ Synopsis:
1010
~ ~~~~~~~~~
11-
~ play status [app_path] [--url=http://...] [--secret=...]
11+
~ play status [app_path] [--url=http://...] [--status-key=...]
1212
~
1313
~ Description:
1414
~ ~~~~~~~~~~~~
@@ -23,10 +23,10 @@
2323
~ The script try to connect to the application at the localhost domain. If you want to monitor an application running on
2424
~ a remote server, specify the application URL using this option (eg. play status --url=http://myapp.com)
2525
~
26-
~ --secret:
27-
~ The script uses the secret key to generate an authorization token. It assumes that the secret key available from the
28-
~ app_path/conf/application.conf is valid. If not you can provide your own secret key using this option
29-
~ (eg. play status --secret=bghjT7ZG7ZGCO8)
26+
~ --status-key:
27+
~ The script uses the status key to generate an authorization token. It assumes that the status key available from the
28+
~ app_path/conf/application.conf is valid (see setting `application.statusKey`).
29+
~ If not you can provide your own status key using this option (eg. play status --status-key=bghjT7ZG7ZGCO8)
3030
~
3131
~ If you provide both options, you can run this command without a local application directory (app_path is not required).
3232
~

documentation/manual/main.textile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -148,7 +148,7 @@ h2. Class enhancement
148148

149149
A Play plug-in (i.e. a subclass of @play.PlayPlugin@) may include ‘enhancers’ that modify application classes at runtime, to add functionality. This is how some of Play’s magic works.
150150

151-
The built-in @play.CorePlugin@ uses enhancers from the @play.classloading.enhancers@ package to dynamically add code to your application’s classes:
151+
The built-in @play.plugins.EnhancerPlugin@ uses enhancers from the @play.classloading.enhancers@ package to dynamically add code to your application’s classes:
152152

153153
* @ContinuationEnhancer@ - adds continuations support to controller classes
154154
* @ControllersEnhancer@ - makes controller action methods thread-safe and adds HTTP redirects for method calls

framework/pym/play/commands/status.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ def execute(**kargs):
4545
http_port = int(app.readConf('http.port'))
4646
url = 'http://localhost:%s/@status' % http_port
4747
if not secret_key:
48-
secret_key = app.readConf('application.secret')
48+
secret_key = app.readConf('application.statusKey')
4949

5050
hm = hmac.new(secret_key, '@status', sha)
5151
authorization = hm.hexdigest()

framework/src/play.plugins

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
0:play.CorePlugin
1+
0:play.plugins.EnhancerPlugin
22
1:play.ConfigurationChangeWatcherPlugin
33
100:play.data.parsing.TempFilePlugin
44
200:play.data.validation.ValidationPlugin
@@ -8,4 +8,5 @@
88
500:play.i18n.MessagesPlugin
99
600:play.libs.WS
1010
700:play.jobs.JobsPlugin
11-
100000:play.plugins.ConfigurablePluginDisablingPlugin
11+
100000:play.plugins.ConfigurablePluginDisablingPlugin
12+
100100:play.plugins.PlayStatusPlugin
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
package play.plugins;
2+
3+
import play.Logger;
4+
import play.PlayPlugin;
5+
import play.classloading.ApplicationClasses.ApplicationClass;
6+
import play.classloading.enhancers.*;
7+
import play.exceptions.UnexpectedException;
8+
9+
/**
10+
* Plugin used for core tasks
11+
*/
12+
public class EnhancerPlugin extends PlayPlugin {
13+
14+
protected Enhancer[] defaultEnhancers() {
15+
return new Enhancer[] { new PropertiesEnhancer(), new ContinuationEnhancer(), new SigEnhancer(), new ControllersEnhancer(),
16+
new MailerEnhancer(), new LocalvariablesNamesEnhancer() };
17+
}
18+
19+
@Override
20+
public void enhance(ApplicationClass applicationClass) {
21+
for (Enhancer enhancer : defaultEnhancers()) {
22+
try {
23+
long start = System.currentTimeMillis();
24+
enhancer.enhanceThisClass(applicationClass);
25+
if (Logger.isTraceEnabled()) {
26+
Logger.trace("%sms to apply %s to %s", System.currentTimeMillis() - start, enhancer.getClass().getSimpleName(),
27+
applicationClass.name);
28+
}
29+
} catch (Exception e) {
30+
throw new UnexpectedException("While applying " + enhancer + " on " + applicationClass.name, e);
31+
}
32+
}
33+
}
34+
}

framework/src/play/CorePlugin.java renamed to framework/src/play/plugins/PlayStatusPlugin.java

Lines changed: 20 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -1,44 +1,29 @@
1-
package play;
2-
3-
import static java.util.Arrays.asList;
4-
5-
import java.io.PrintWriter;
6-
import java.io.StringWriter;
7-
import java.text.SimpleDateFormat;
8-
import java.util.ArrayList;
9-
import java.util.Collections;
10-
import java.util.Comparator;
11-
import java.util.Date;
12-
import java.util.List;
13-
14-
import org.apache.commons.lang.StringUtils;
1+
package play.plugins;
152

163
import com.google.gson.JsonArray;
174
import com.google.gson.JsonObject;
185
import com.google.gson.JsonPrimitive;
196
import com.jamonapi.Monitor;
207
import com.jamonapi.MonitorFactory;
218
import com.jamonapi.utils.Misc;
22-
9+
import org.apache.commons.lang.StringUtils;
10+
import play.Invoker;
11+
import play.Logger;
12+
import play.Play;
2313
import play.Play.Mode;
24-
import play.classloading.ApplicationClasses.ApplicationClass;
25-
import play.classloading.enhancers.ContinuationEnhancer;
26-
import play.classloading.enhancers.ControllersEnhancer;
27-
import play.classloading.enhancers.Enhancer;
28-
import play.classloading.enhancers.LocalvariablesNamesEnhancer;
29-
import play.classloading.enhancers.MailerEnhancer;
30-
import play.classloading.enhancers.PropertiesEnhancer;
31-
import play.classloading.enhancers.SigEnhancer;
32-
import play.exceptions.UnexpectedException;
33-
import play.libs.Crypto;
14+
import play.PlayPlugin;
3415
import play.mvc.Http.Header;
3516
import play.mvc.Http.Request;
3617
import play.mvc.Http.Response;
3718

38-
/**
39-
* Plugin used for core tasks
40-
*/
41-
public class CorePlugin extends PlayPlugin {
19+
import java.io.PrintWriter;
20+
import java.io.StringWriter;
21+
import java.text.SimpleDateFormat;
22+
import java.util.*;
23+
24+
import static java.util.Arrays.asList;
25+
26+
public class PlayStatusPlugin extends PlayPlugin {
4227

4328
/**
4429
* Get the application status
@@ -47,7 +32,7 @@ public class CorePlugin extends PlayPlugin {
4732
* true if the status should be return in JSON
4833
* @return application status
4934
*/
50-
public static String computeApplicationStatus(boolean json) {
35+
public String computeApplicationStatus(boolean json) {
5136
if (json) {
5237
JsonObject o = new JsonObject();
5338
for (PlayPlugin plugin : Play.pluginCollection.getEnabledPlugins()) {
@@ -104,8 +89,8 @@ public boolean rawInvocation(Request request, Response response) throws Exceptio
10489
}
10590
response.contentType = request.path.contains(".json") ? "application/json" : "text/plain";
10691
Header authorization = request.headers.get("authorization");
107-
if (authorization != null && (Crypto.sign("@status").equals(authorization.value())
108-
|| System.getProperty("statusKey", Play.secretKey).equals(authorization.value()))) {
92+
String statusKey = Play.configuration.getProperty("application.statusKey", System.getProperty("statusKey"));
93+
if (authorization != null && statusKey != null && statusKey.equals(authorization.value())) {
10994
response.print(computeApplicationStatus(request.path.contains(".json")));
11095
response.status = 200;
11196
return true;
@@ -184,12 +169,7 @@ public String getStatus() {
184169
out.println("Monitors:");
185170
out.println("~~~~~~~~");
186171
List<Monitor> monitors = new ArrayList<>(asList(MonitorFactory.getRootMonitor().getMonitors()));
187-
Collections.sort(monitors, new Comparator<Monitor>() {
188-
@Override
189-
public int compare(Monitor m1, Monitor m2) {
190-
return Double.compare(m2.getTotal(), m1.getTotal());
191-
}
192-
});
172+
monitors.sort((m1, m2) -> Double.compare(m2.getTotal(), m1.getTotal()));
193173
int lm = 10;
194174
for (Monitor monitor : monitors) {
195175
if (monitor.getLabel().length() > lm) {
@@ -269,7 +249,7 @@ public JsonObject getJsonStatus() {
269249
/**
270250
* Recursively visit all JVM threads
271251
*/
272-
static void visit(PrintWriter out, ThreadGroup group, int level) {
252+
private void visit(PrintWriter out, ThreadGroup group, int level) {
273253
// Get threads in `group'
274254
int numThreads = group.activeCount();
275255
Thread[] threads = new Thread[numThreads * 2];
@@ -296,32 +276,11 @@ static void visit(PrintWriter out, ThreadGroup group, int level) {
296276
/**
297277
* Retrieve the JVM root thread group.
298278
*/
299-
static ThreadGroup getRootThread() {
279+
private ThreadGroup getRootThread() {
300280
ThreadGroup root = Thread.currentThread().getThreadGroup().getParent();
301281
while (root.getParent() != null) {
302282
root = root.getParent();
303283
}
304284
return root;
305285
}
306-
307-
protected Enhancer[] defaultEnhancers() {
308-
return new Enhancer[] { new PropertiesEnhancer(), new ContinuationEnhancer(), new SigEnhancer(), new ControllersEnhancer(),
309-
new MailerEnhancer(), new LocalvariablesNamesEnhancer() };
310-
}
311-
312-
@Override
313-
public void enhance(ApplicationClass applicationClass) throws Exception {
314-
for (Enhancer enhancer : defaultEnhancers()) {
315-
try {
316-
long start = System.currentTimeMillis();
317-
enhancer.enhanceThisClass(applicationClass);
318-
if (Logger.isTraceEnabled()) {
319-
Logger.trace("%sms to apply %s to %s", System.currentTimeMillis() - start, enhancer.getClass().getSimpleName(),
320-
applicationClass.name);
321-
}
322-
} catch (Exception e) {
323-
throw new UnexpectedException("While applying " + enhancer + " on " + applicationClass.name, e);
324-
}
325-
}
326-
}
327286
}

framework/test-src/play/plugins/PluginCollectionTest.java

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ public void verifyLoading() {
3535

3636
//the following plugin-list should match the list in the file 'play.plugins'
3737
assertThat(pc.getEnabledPlugins()).containsExactly(
38-
pc.getPluginInstance(CorePlugin.class),
38+
pc.getPluginInstance(EnhancerPlugin.class),
3939
pc.getPluginInstance(ConfigurationChangeWatcherPlugin.class),
4040
pc.getPluginInstance(TempFilePlugin.class),
4141
pc.getPluginInstance(ValidationPlugin.class),
@@ -45,7 +45,8 @@ public void verifyLoading() {
4545
pc.getPluginInstance(MessagesPlugin.class),
4646
pc.getPluginInstance(WS.class),
4747
pc.getPluginInstance(JobsPlugin.class),
48-
pc.getPluginInstance(ConfigurablePluginDisablingPlugin.class));
48+
pc.getPluginInstance(ConfigurablePluginDisablingPlugin.class),
49+
pc.getPluginInstance(PlayStatusPlugin.class));
4950
}
5051

5152
@Test
@@ -63,11 +64,11 @@ protected boolean isLoadedByApplicationClassloader(PlayPlugin plugin) {
6364

6465
pc.loadPlugins();
6566

66-
CorePlugin corePlugin_first_instance = pc.getPluginInstance(CorePlugin.class);
67+
EnhancerPlugin enhancerPlugin_first_instance = pc.getPluginInstance(EnhancerPlugin.class);
6768
TestPlugin testPlugin_first_instance = pc.getPluginInstance(TestPlugin.class);
6869

6970
assertThat(pc.getAllPlugins()).containsExactly(
70-
corePlugin_first_instance,
71+
enhancerPlugin_first_instance,
7172
testPlugin_first_instance);
7273

7374
}
@@ -117,22 +118,22 @@ protected boolean isLoadedByApplicationClassloader(PlayPlugin plugin) {
117118

118119
pc.loadPlugins();
119120

120-
CorePlugin corePlugin_first_instance = pc.getPluginInstance(CorePlugin.class);
121+
EnhancerPlugin enhancerPlugin_first_instance = pc.getPluginInstance(EnhancerPlugin.class);
121122
TestPlugin testPlugin_first_instance = pc.getPluginInstance(TestPlugin.class);
122123

123124
//the following plugin-list should match the list in the file 'play.plugins'
124125
assertThat(pc.getEnabledPlugins()).containsExactly(
125-
corePlugin_first_instance,
126+
enhancerPlugin_first_instance,
126127
testPlugin_first_instance);
127128
assertThat(pc.getAllPlugins()).containsExactly(
128-
corePlugin_first_instance,
129+
enhancerPlugin_first_instance,
129130
testPlugin_first_instance);
130131

131132
pc.reloadApplicationPlugins();
132133

133134
TestPlugin testPlugin_second_instance = pc.getPluginInstance(TestPlugin.class);
134135

135-
assertThat(pc.getPluginInstance(CorePlugin.class)).isEqualTo( corePlugin_first_instance);
136+
assertThat(pc.getPluginInstance(EnhancerPlugin.class)).isEqualTo(enhancerPlugin_first_instance);
136137
assertThat(testPlugin_second_instance).isNotEqualTo( testPlugin_first_instance);
137138

138139
}
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
0:play.CorePlugin
1+
0:play.plugins.EnhancerPlugin
22

33
1:play.plugins.TestPlugin
44

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
1-
0:play.CorePlugin
1+
0:play.plugins.EnhancerPlugin
22
1:play.plugins.TestPlugin

0 commit comments

Comments
 (0)