зеркало из https://github.com/github/codeql.git
Merge branch 'main' into redsun82/bzlmod
This commit is contained in:
Коммит
a944443d39
|
@ -0,0 +1,4 @@
|
||||||
|
---
|
||||||
|
category: minorAnalysis
|
||||||
|
---
|
||||||
|
* An extension point for sanitizers of the query `java/unvalidated-url-redirection` has been added.
|
|
@ -0,0 +1,42 @@
|
||||||
|
/** Definitions for the insecure local authentication query. */
|
||||||
|
|
||||||
|
import java
|
||||||
|
|
||||||
|
/** A base class that is used as a callback for biometric authentication. */
|
||||||
|
private class AuthenticationCallbackClass extends Class {
|
||||||
|
AuthenticationCallbackClass() {
|
||||||
|
this.hasQualifiedName("android.hardware.fingerprint",
|
||||||
|
"FingerprintManager$AuthenticationCallback")
|
||||||
|
or
|
||||||
|
this.hasQualifiedName("android.hardware.biometrics", "BiometricPrompt$AuthenticationCallback")
|
||||||
|
or
|
||||||
|
this.hasQualifiedName("androidx.biometric", "BiometricPrompt$AuthenticationCallback")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/** An implementation of the `onAuthenticationSucceeded` method for an authentication callback. */
|
||||||
|
class AuthenticationSuccessCallback extends Method {
|
||||||
|
AuthenticationSuccessCallback() {
|
||||||
|
this.getDeclaringType().getASupertype+() instanceof AuthenticationCallbackClass and
|
||||||
|
this.hasName("onAuthenticationSucceeded")
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Gets the parameter containing the `authenticationResult`. */
|
||||||
|
Parameter getResultParameter() { result = this.getParameter(0) }
|
||||||
|
|
||||||
|
/** Gets a use of the result parameter that's used in a `super` call to the base `AuthenticationCallback` class. */
|
||||||
|
private VarAccess getASuperResultUse() {
|
||||||
|
exists(SuperMethodCall sup |
|
||||||
|
sup.getEnclosingCallable() = this and
|
||||||
|
result = sup.getArgument(0) and
|
||||||
|
result = this.getResultParameter().getAnAccess() and
|
||||||
|
this.getDeclaringType().getASupertype() instanceof AuthenticationCallbackClass
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Gets a use of the result parameter, other than one used in a `super` call. */
|
||||||
|
VarAccess getAResultUse() {
|
||||||
|
result = this.getResultParameter().getAnAccess() and
|
||||||
|
not result = this.getASuperResultUse()
|
||||||
|
}
|
||||||
|
}
|
|
@ -6,10 +6,14 @@ private import semmle.code.java.dataflow.ExternalFlow
|
||||||
import semmle.code.java.frameworks.Servlets
|
import semmle.code.java.frameworks.Servlets
|
||||||
import semmle.code.java.frameworks.ApacheHttp
|
import semmle.code.java.frameworks.ApacheHttp
|
||||||
private import semmle.code.java.frameworks.JaxWS
|
private import semmle.code.java.frameworks.JaxWS
|
||||||
|
private import semmle.code.java.security.RequestForgery
|
||||||
|
|
||||||
/** A URL redirection sink. */
|
/** A URL redirection sink. */
|
||||||
abstract class UrlRedirectSink extends DataFlow::Node { }
|
abstract class UrlRedirectSink extends DataFlow::Node { }
|
||||||
|
|
||||||
|
/** A URL redirection sanitizer. */
|
||||||
|
abstract class UrlRedirectSanitizer extends DataFlow::Node { }
|
||||||
|
|
||||||
/** A default sink represeting methods susceptible to URL redirection attacks. */
|
/** A default sink represeting methods susceptible to URL redirection attacks. */
|
||||||
private class DefaultUrlRedirectSink extends UrlRedirectSink {
|
private class DefaultUrlRedirectSink extends UrlRedirectSink {
|
||||||
DefaultUrlRedirectSink() { sinkNode(this, "url-redirection") }
|
DefaultUrlRedirectSink() { sinkNode(this, "url-redirection") }
|
||||||
|
@ -42,3 +46,6 @@ private class ApacheUrlRedirectSink extends UrlRedirectSink {
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private class DefaultUrlRedirectSanitizer extends UrlRedirectSanitizer instanceof RequestForgerySanitizer
|
||||||
|
{ }
|
||||||
|
|
|
@ -11,6 +11,8 @@ module UrlRedirectConfig implements DataFlow::ConfigSig {
|
||||||
predicate isSource(DataFlow::Node source) { source instanceof ThreatModelFlowSource }
|
predicate isSource(DataFlow::Node source) { source instanceof ThreatModelFlowSource }
|
||||||
|
|
||||||
predicate isSink(DataFlow::Node sink) { sink instanceof UrlRedirectSink }
|
predicate isSink(DataFlow::Node sink) { sink instanceof UrlRedirectSink }
|
||||||
|
|
||||||
|
predicate isBarrier(DataFlow::Node node) { node instanceof UrlRedirectSanitizer }
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -4,7 +4,7 @@
|
||||||
* malicious changes in the PATH environment variable.
|
* malicious changes in the PATH environment variable.
|
||||||
* @kind problem
|
* @kind problem
|
||||||
* @problem.severity warning
|
* @problem.severity warning
|
||||||
* @security-severity 9.8
|
* @security-severity 5.4
|
||||||
* @precision medium
|
* @precision medium
|
||||||
* @id java/relative-path-command
|
* @id java/relative-path-command
|
||||||
* @tags security
|
* @tags security
|
||||||
|
|
|
@ -0,0 +1,42 @@
|
||||||
|
<!DOCTYPE qhelp PUBLIC
|
||||||
|
"-//Semmle//qhelp//EN"
|
||||||
|
"qhelp.dtd">
|
||||||
|
<qhelp>
|
||||||
|
|
||||||
|
<overview>
|
||||||
|
<p>
|
||||||
|
Biometric local authentication such as fingerprint recognition can be used to protect sensitive data or actions within an application.
|
||||||
|
However, if this authentication does not use a <code>KeyStore</code>-backed key, it can be bypassed by a privileged malicious application, or by an attacker with physical access using application hooking tools such as Frida.
|
||||||
|
</p>
|
||||||
|
</overview>
|
||||||
|
|
||||||
|
<recommendation>
|
||||||
|
<p>
|
||||||
|
Generate a secure key in the Android <code>KeyStore</code>. Ensure that the <code>onAuthenticationSuccess</code> callback for a biometric prompt uses it
|
||||||
|
in a way that is required for the sensitive parts of the application to function, such as by using it to decrypt sensitive data or credentials.
|
||||||
|
</p>
|
||||||
|
</recommendation>
|
||||||
|
|
||||||
|
<example>
|
||||||
|
<p>In the following (bad) case, no <code>CryptoObject</code> is required for the biometric prompt to grant access, so it can be bypassed.</p>
|
||||||
|
<sample src="AndroidInsecureLocalAuthenticationBad.java" />
|
||||||
|
<p>In the following (good) case, a secret key is generated in the Android <code>KeyStore</code>. The application requires this secret key for access, using it to decrypt data.</p>
|
||||||
|
<sample src="AndroidInsecureLocalAuthenticationGood.java" />
|
||||||
|
</example>
|
||||||
|
|
||||||
|
<references>
|
||||||
|
<li>
|
||||||
|
OWASP Mobile Application Security: <a href="https://mas.owasp.org/MASTG/Android/0x05f-Testing-Local-Authentication/">Android Local Authentication</a>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
OWASP Mobile Application Security: <a href="https://mas.owasp.org/MASTG/tests/android/MASVS-AUTH/MASTG-TEST-0018/">Testing Biometric Authentication</a>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
WithSecure: <a href="https://labs.withsecure.com/publications/how-secure-is-your-android-keystore-authentication">How Secure is your Android Keystore Authentication?</a>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
Android Developers: <a href="https://developer.android.com/training/sign-in/biometric-auth">Biometric Authentication</a>
|
||||||
|
</li>
|
||||||
|
|
||||||
|
</references>
|
||||||
|
</qhelp>
|
|
@ -0,0 +1,18 @@
|
||||||
|
/**
|
||||||
|
* @name Insecure local authentication
|
||||||
|
* @description Local authentication that does not make use of a `CryptoObject` can be bypassed.
|
||||||
|
* @kind problem
|
||||||
|
* @problem.severity warning
|
||||||
|
* @security-severity 4.4
|
||||||
|
* @precision high
|
||||||
|
* @id java/android/insecure-local-authentication
|
||||||
|
* @tags security
|
||||||
|
* external/cwe/cwe-287
|
||||||
|
*/
|
||||||
|
|
||||||
|
import java
|
||||||
|
import semmle.code.java.security.AndroidLocalAuthQuery
|
||||||
|
|
||||||
|
from AuthenticationSuccessCallback c
|
||||||
|
where not exists(c.getAResultUse())
|
||||||
|
select c, "This authentication callback does not use its result for a cryptographic operation."
|
|
@ -0,0 +1,11 @@
|
||||||
|
biometricPrompt.authenticate(
|
||||||
|
cancellationSignal,
|
||||||
|
executor,
|
||||||
|
new BiometricPrompt.AuthenticationCallback {
|
||||||
|
@Override
|
||||||
|
// BAD: This authentication callback does not make use of a `CryptoObject` from the `result`.
|
||||||
|
public void onAuthenticationSucceeded(BiometricPrompt.AuthenticationResult result) {
|
||||||
|
grantAccess()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
)
|
|
@ -0,0 +1,48 @@
|
||||||
|
private void generateSecretKey() {
|
||||||
|
KeyGenParameterSpec keyGenParameterSpec = new KeyGenParameterSpec.Builder(
|
||||||
|
"MySecretKey",
|
||||||
|
KeyProperties.PURPOSE_ENCRYPT | KeyProperties.PURPOSE_DECRYPT)
|
||||||
|
.setBlockModes(KeyProperties.BLOCK_MODE_CBC)
|
||||||
|
.setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_PKCS7)
|
||||||
|
.setUserAuthenticationRequired(true)
|
||||||
|
.setInvalidatedByBiometricEnrollment(true)
|
||||||
|
.build();
|
||||||
|
KeyGenerator keyGenerator = KeyGenerator.getInstance(
|
||||||
|
KeyProperties.KEY_ALGORITHM_AES, "AndroidKeyStore");
|
||||||
|
keyGenerator.init(keyGenParameterSpec);
|
||||||
|
keyGenerator.generateKey();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private SecretKey getSecretKey() {
|
||||||
|
KeyStore keyStore = KeyStore.getInstance("AndroidKeyStore");
|
||||||
|
keyStore.load(null);
|
||||||
|
return ((SecretKey)keyStore.getKey("MySecretKey", null));
|
||||||
|
}
|
||||||
|
|
||||||
|
private Cipher getCipher() {
|
||||||
|
return Cipher.getInstance(KeyProperties.KEY_ALGORITHM_AES + "/"
|
||||||
|
+ KeyProperties.BLOCK_MODE_CBC + "/"
|
||||||
|
+ KeyProperties.ENCRYPTION_PADDING_PKCS7);
|
||||||
|
}
|
||||||
|
|
||||||
|
public prompt(byte[] encryptedData) {
|
||||||
|
Cipher cipher = getCipher();
|
||||||
|
SecretKey secretKey = getSecretKey();
|
||||||
|
cipher.init(Cipher.DECRYPT_MODE, secretKey);
|
||||||
|
|
||||||
|
biometricPrompt.authenticate(
|
||||||
|
new BiometricPrompt.CryptoObject(cipher),
|
||||||
|
cancellationSignal,
|
||||||
|
executor,
|
||||||
|
new BiometricPrompt.AuthenticationCallback() {
|
||||||
|
@Override
|
||||||
|
// GOOD: This authentication callback uses the result to decrypt some data.
|
||||||
|
public void onAuthenticationSucceeded(BiometricPrompt.AuthenticationResult result) {
|
||||||
|
Cipher cipher = result.getCryptoObject().getCipher();
|
||||||
|
byte[] decryptedData = cipher.doFinal(encryptedData);
|
||||||
|
grantAccessWithData(decryptedData);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
|
@ -0,0 +1,5 @@
|
||||||
|
|
||||||
|
---
|
||||||
|
category: newQuery
|
||||||
|
---
|
||||||
|
* Added a new query `java/android/insecure-local-authentication` for finding uses of biometric authentication APIs that do not make use of a `KeyStore`-backed key and thus may be bypassed.
|
|
@ -0,0 +1,4 @@
|
||||||
|
---
|
||||||
|
category: minorAnalysis
|
||||||
|
---
|
||||||
|
* The query `java/unvalidated-url-redirection` now sanitizes results following the same logic as the query `java/ssrf`. URLs the destination of which cannot be externally controlled will not be reported anymore.
|
|
@ -0,0 +1,4 @@
|
||||||
|
---
|
||||||
|
category: queryMetadata
|
||||||
|
---
|
||||||
|
* The `security-severity` score of the query `java/relative-path-command` has been reduced to better adjust it to the specific conditions needed for exploitation.
|
|
@ -277,19 +277,19 @@
|
||||||
| enumClass.kt:8:3:11:4 | VAL | TypeAccess |
|
| enumClass.kt:8:3:11:4 | VAL | TypeAccess |
|
||||||
| enumClass.kt:8:3:11:4 | new EnumWithFunctions(...) | ClassInstanceExpr |
|
| enumClass.kt:8:3:11:4 | new EnumWithFunctions(...) | ClassInstanceExpr |
|
||||||
| enumClass.kt:8:3:11:4 | new VAL(...) | ClassInstanceExpr |
|
| enumClass.kt:8:3:11:4 | new VAL(...) | ClassInstanceExpr |
|
||||||
| enumClass.kt:9:14:9:30 | int | TypeAccess |
|
| enumClass.kt:9:5:9:30 | int | TypeAccess |
|
||||||
| enumClass.kt:9:20:9:25 | int | TypeAccess |
|
| enumClass.kt:9:20:9:25 | int | TypeAccess |
|
||||||
| enumClass.kt:9:30:9:30 | i | VarAccess |
|
| enumClass.kt:9:30:9:30 | i | VarAccess |
|
||||||
| enumClass.kt:10:14:10:42 | int | TypeAccess |
|
| enumClass.kt:10:5:10:42 | int | TypeAccess |
|
||||||
| enumClass.kt:10:20:10:25 | int | TypeAccess |
|
| enumClass.kt:10:20:10:25 | int | TypeAccess |
|
||||||
| enumClass.kt:10:30:10:33 | this | ThisAccess |
|
| enumClass.kt:10:30:10:33 | this | ThisAccess |
|
||||||
| enumClass.kt:10:30:10:38 | f(...) | MethodCall |
|
| enumClass.kt:10:30:10:38 | f(...) | MethodCall |
|
||||||
| enumClass.kt:10:30:10:42 | ... + ... | AddExpr |
|
| enumClass.kt:10:30:10:42 | ... + ... | AddExpr |
|
||||||
| enumClass.kt:10:37:10:37 | i | VarAccess |
|
| enumClass.kt:10:37:10:37 | i | VarAccess |
|
||||||
| enumClass.kt:10:42:10:42 | i | VarAccess |
|
| enumClass.kt:10:42:10:42 | i | VarAccess |
|
||||||
| enumClass.kt:13:12:13:29 | int | TypeAccess |
|
| enumClass.kt:13:3:13:29 | int | TypeAccess |
|
||||||
| enumClass.kt:13:18:13:23 | int | TypeAccess |
|
| enumClass.kt:13:18:13:23 | int | TypeAccess |
|
||||||
| enumClass.kt:14:12:14:29 | int | TypeAccess |
|
| enumClass.kt:14:3:14:29 | int | TypeAccess |
|
||||||
| enumClass.kt:14:18:14:23 | int | TypeAccess |
|
| enumClass.kt:14:18:14:23 | int | TypeAccess |
|
||||||
| methods2.kt:4:1:5:1 | Unit | TypeAccess |
|
| methods2.kt:4:1:5:1 | Unit | TypeAccess |
|
||||||
| methods2.kt:4:26:4:31 | int | TypeAccess |
|
| methods2.kt:4:26:4:31 | int | TypeAccess |
|
||||||
|
@ -341,15 +341,15 @@
|
||||||
| methods4.kt:7:5:7:34 | Unit | TypeAccess |
|
| methods4.kt:7:5:7:34 | Unit | TypeAccess |
|
||||||
| methods4.kt:7:11:7:29 | InsideNestedTest | TypeAccess |
|
| methods4.kt:7:11:7:29 | InsideNestedTest | TypeAccess |
|
||||||
| methods5.kt:3:1:11:1 | Unit | TypeAccess |
|
| methods5.kt:3:1:11:1 | Unit | TypeAccess |
|
||||||
| methods5.kt:4:7:4:7 | x | LocalVariableDeclExpr |
|
| methods5.kt:4:3:4:11 | x | LocalVariableDeclExpr |
|
||||||
| methods5.kt:4:11:4:11 | 5 | IntegerLiteral |
|
| methods5.kt:4:11:4:11 | 5 | IntegerLiteral |
|
||||||
| methods5.kt:5:3:5:27 | int | TypeAccess |
|
| methods5.kt:5:3:5:27 | int | TypeAccess |
|
||||||
| methods5.kt:5:13:5:18 | int | TypeAccess |
|
| methods5.kt:5:13:5:18 | int | TypeAccess |
|
||||||
| methods5.kt:5:23:5:23 | i | VarAccess |
|
| methods5.kt:5:23:5:23 | i | VarAccess |
|
||||||
| methods5.kt:5:23:5:27 | ... + ... | AddExpr |
|
| methods5.kt:5:23:5:27 | ... + ... | AddExpr |
|
||||||
| methods5.kt:5:27:5:27 | x | VarAccess |
|
| methods5.kt:5:27:5:27 | x | VarAccess |
|
||||||
| methods5.kt:6:3:6:3 | x | VarAccess |
|
|
||||||
| methods5.kt:6:3:6:7 | ...=... | AssignExpr |
|
| methods5.kt:6:3:6:7 | ...=... | AssignExpr |
|
||||||
|
| methods5.kt:6:3:6:7 | x | VarAccess |
|
||||||
| methods5.kt:6:7:6:7 | 6 | IntegerLiteral |
|
| methods5.kt:6:7:6:7 | 6 | IntegerLiteral |
|
||||||
| methods5.kt:7:3:7:15 | <implicit coercion to unit> | ImplicitCoercionToUnitExpr |
|
| methods5.kt:7:3:7:15 | <implicit coercion to unit> | ImplicitCoercionToUnitExpr |
|
||||||
| methods5.kt:7:3:7:15 | Object | TypeAccess |
|
| methods5.kt:7:3:7:15 | Object | TypeAccess |
|
||||||
|
@ -358,8 +358,8 @@
|
||||||
| methods5.kt:7:3:7:15 | a(...) | MethodCall |
|
| methods5.kt:7:3:7:15 | a(...) | MethodCall |
|
||||||
| methods5.kt:7:3:7:15 | new (...) | ClassInstanceExpr |
|
| methods5.kt:7:3:7:15 | new (...) | ClassInstanceExpr |
|
||||||
| methods5.kt:7:13:7:14 | 42 | IntegerLiteral |
|
| methods5.kt:7:13:7:14 | 42 | IntegerLiteral |
|
||||||
| methods5.kt:8:3:8:3 | x | VarAccess |
|
|
||||||
| methods5.kt:8:3:8:7 | ...=... | AssignExpr |
|
| methods5.kt:8:3:8:7 | ...=... | AssignExpr |
|
||||||
|
| methods5.kt:8:3:8:7 | x | VarAccess |
|
||||||
| methods5.kt:8:7:8:7 | 7 | IntegerLiteral |
|
| methods5.kt:8:7:8:7 | 7 | IntegerLiteral |
|
||||||
| methods5.kt:9:3:9:32 | int | TypeAccess |
|
| methods5.kt:9:3:9:32 | int | TypeAccess |
|
||||||
| methods5.kt:9:12:9:17 | C1<T1> | TypeAccess |
|
| methods5.kt:9:12:9:17 | C1<T1> | TypeAccess |
|
||||||
|
@ -376,7 +376,7 @@
|
||||||
| methods5.kt:10:13:10:18 | <implicit coercion to unit> | ImplicitCoercionToUnitExpr |
|
| methods5.kt:10:13:10:18 | <implicit coercion to unit> | ImplicitCoercionToUnitExpr |
|
||||||
| methods5.kt:10:13:10:18 | Unit | TypeAccess |
|
| methods5.kt:10:13:10:18 | Unit | TypeAccess |
|
||||||
| methods5.kt:10:16:10:17 | 42 | IntegerLiteral |
|
| methods5.kt:10:16:10:17 | 42 | IntegerLiteral |
|
||||||
| methods6.kt:3:9:4:1 | Unit | TypeAccess |
|
| methods6.kt:3:1:4:1 | Unit | TypeAccess |
|
||||||
| methods.kt:2:1:3:1 | Unit | TypeAccess |
|
| methods.kt:2:1:3:1 | Unit | TypeAccess |
|
||||||
| methods.kt:2:20:2:25 | int | TypeAccess |
|
| methods.kt:2:20:2:25 | int | TypeAccess |
|
||||||
| methods.kt:2:28:2:33 | int | TypeAccess |
|
| methods.kt:2:28:2:33 | int | TypeAccess |
|
||||||
|
@ -394,9 +394,9 @@
|
||||||
| methods.kt:11:9:11:28 | topLevelMethod(...) | MethodCall |
|
| methods.kt:11:9:11:28 | topLevelMethod(...) | MethodCall |
|
||||||
| methods.kt:11:24:11:24 | b | VarAccess |
|
| methods.kt:11:24:11:24 | b | VarAccess |
|
||||||
| methods.kt:11:27:11:27 | 4 | IntegerLiteral |
|
| methods.kt:11:27:11:27 | 4 | IntegerLiteral |
|
||||||
| methods.kt:14:12:14:29 | Unit | TypeAccess |
|
| methods.kt:14:5:14:29 | Unit | TypeAccess |
|
||||||
| methods.kt:15:15:15:35 | Unit | TypeAccess |
|
| methods.kt:15:5:15:35 | Unit | TypeAccess |
|
||||||
| methods.kt:16:13:16:31 | Unit | TypeAccess |
|
| methods.kt:16:5:16:31 | Unit | TypeAccess |
|
||||||
| methods.kt:17:14:17:33 | Unit | TypeAccess |
|
| methods.kt:17:5:17:33 | Unit | TypeAccess |
|
||||||
| methods.kt:18:5:18:36 | Unit | TypeAccess |
|
| methods.kt:18:5:18:36 | Unit | TypeAccess |
|
||||||
| methods.kt:19:12:19:29 | Unit | TypeAccess |
|
| methods.kt:19:5:19:29 | Unit | TypeAccess |
|
||||||
|
|
|
@ -2,19 +2,19 @@ methods
|
||||||
| clinit.kt:0:0:0:0 | ClinitKt | clinit.kt:0:0:0:0 | <clinit> | <clinit>() | static | Compiler generated |
|
| clinit.kt:0:0:0:0 | ClinitKt | clinit.kt:0:0:0:0 | <clinit> | <clinit>() | static | Compiler generated |
|
||||||
| clinit.kt:0:0:0:0 | ClinitKt | clinit.kt:3:1:3:24 | getTopLevelInt | getTopLevelInt() | final, public, static | Compiler generated |
|
| clinit.kt:0:0:0:0 | ClinitKt | clinit.kt:3:1:3:24 | getTopLevelInt | getTopLevelInt() | final, public, static | Compiler generated |
|
||||||
| clinit.kt:0:0:0:0 | ClinitKt | clinit.kt:3:1:3:24 | setTopLevelInt | setTopLevelInt(int) | final, public, static | Compiler generated |
|
| clinit.kt:0:0:0:0 | ClinitKt | clinit.kt:3:1:3:24 | setTopLevelInt | setTopLevelInt(int) | final, public, static | Compiler generated |
|
||||||
|
| dataClass.kt:1:1:1:47 | DataClass | dataClass.kt:0:0:0:0 | component1 | component1() | final, public | Compiler generated |
|
||||||
|
| dataClass.kt:1:1:1:47 | DataClass | dataClass.kt:0:0:0:0 | component2 | component2() | final, public | Compiler generated |
|
||||||
|
| dataClass.kt:1:1:1:47 | DataClass | dataClass.kt:0:0:0:0 | copy | copy(int,java.lang.String) | final, public | Compiler generated |
|
||||||
|
| dataClass.kt:1:1:1:47 | DataClass | dataClass.kt:0:0:0:0 | copy$default | copy$default(DataClass,int,java.lang.String,int,java.lang.Object) | public, static | Compiler generated |
|
||||||
| dataClass.kt:1:1:1:47 | DataClass | dataClass.kt:0:0:0:0 | equals | equals(java.lang.Object) | override, public | Compiler generated |
|
| dataClass.kt:1:1:1:47 | DataClass | dataClass.kt:0:0:0:0 | equals | equals(java.lang.Object) | override, public | Compiler generated |
|
||||||
| dataClass.kt:1:1:1:47 | DataClass | dataClass.kt:0:0:0:0 | hashCode | hashCode() | override, public | Compiler generated |
|
| dataClass.kt:1:1:1:47 | DataClass | dataClass.kt:0:0:0:0 | hashCode | hashCode() | override, public | Compiler generated |
|
||||||
| dataClass.kt:1:1:1:47 | DataClass | dataClass.kt:0:0:0:0 | toString | toString() | override, public | Compiler generated |
|
| dataClass.kt:1:1:1:47 | DataClass | dataClass.kt:0:0:0:0 | toString | toString() | override, public | Compiler generated |
|
||||||
| dataClass.kt:1:1:1:47 | DataClass | dataClass.kt:1:1:1:47 | copy | copy(int,java.lang.String) | final, public | Compiler generated |
|
|
||||||
| dataClass.kt:1:1:1:47 | DataClass | dataClass.kt:1:1:1:47 | copy$default | copy$default(DataClass,int,java.lang.String,int,java.lang.Object) | public, static | Compiler generated |
|
|
||||||
| dataClass.kt:1:1:1:47 | DataClass | dataClass.kt:1:22:1:31 | component1 | component1() | final, public | Compiler generated |
|
|
||||||
| dataClass.kt:1:1:1:47 | DataClass | dataClass.kt:1:22:1:31 | getX | getX() | final, public | Compiler generated |
|
| dataClass.kt:1:1:1:47 | DataClass | dataClass.kt:1:22:1:31 | getX | getX() | final, public | Compiler generated |
|
||||||
| dataClass.kt:1:1:1:47 | DataClass | dataClass.kt:1:34:1:46 | component2 | component2() | final, public | Compiler generated |
|
|
||||||
| dataClass.kt:1:1:1:47 | DataClass | dataClass.kt:1:34:1:46 | getY | getY() | final, public | Compiler generated |
|
| dataClass.kt:1:1:1:47 | DataClass | dataClass.kt:1:34:1:46 | getY | getY() | final, public | Compiler generated |
|
||||||
| dataClass.kt:1:1:1:47 | DataClass | dataClass.kt:1:34:1:46 | setY | setY(java.lang.String) | final, public | Compiler generated |
|
| dataClass.kt:1:1:1:47 | DataClass | dataClass.kt:1:34:1:46 | setY | setY(java.lang.String) | final, public | Compiler generated |
|
||||||
| delegates.kt:3:1:12:1 | MyClass | delegates.kt:4:5:6:5 | getLazyProp | getLazyProp() | final, public | Compiler generated |
|
| delegates.kt:3:1:12:1 | MyClass | delegates.kt:4:21:6:5 | getLazyProp | getLazyProp() | final, public | Compiler generated |
|
||||||
| delegates.kt:3:1:12:1 | MyClass | delegates.kt:8:5:11:5 | getObservableProp | getObservableProp() | final, public | Compiler generated |
|
|
||||||
| delegates.kt:3:1:12:1 | MyClass | delegates.kt:8:5:11:5 | setObservableProp | setObservableProp(java.lang.String) | final, public | Compiler generated |
|
| delegates.kt:3:1:12:1 | MyClass | delegates.kt:8:5:11:5 | setObservableProp | setObservableProp(java.lang.String) | final, public | Compiler generated |
|
||||||
|
| delegates.kt:3:1:12:1 | MyClass | delegates.kt:8:35:11:5 | getObservableProp | getObservableProp() | final, public | Compiler generated |
|
||||||
| delegates.kt:4:21:6:5 | new KProperty1<MyClass,Integer>(...) { ... } | delegates.kt:4:21:6:5 | get | get(MyClass) | override, public | |
|
| delegates.kt:4:21:6:5 | new KProperty1<MyClass,Integer>(...) { ... } | delegates.kt:4:21:6:5 | get | get(MyClass) | override, public | |
|
||||||
| delegates.kt:4:21:6:5 | new KProperty1<MyClass,Integer>(...) { ... } | delegates.kt:4:21:6:5 | invoke | invoke(MyClass) | override, public | |
|
| delegates.kt:4:21:6:5 | new KProperty1<MyClass,Integer>(...) { ... } | delegates.kt:4:21:6:5 | invoke | invoke(MyClass) | override, public | |
|
||||||
| delegates.kt:4:26:6:5 | new Function0<Integer>(...) { ... } | delegates.kt:4:26:6:5 | invoke | invoke() | final, override, public | |
|
| delegates.kt:4:26:6:5 | new Function0<Integer>(...) { ... } | delegates.kt:4:26:6:5 | invoke | invoke() | final, override, public | |
|
||||||
|
|
|
@ -1,12 +1,12 @@
|
||||||
| clinit.kt:3:1:3:24 | setTopLevelInt | clinit.kt:3:1:3:24 | <set-?> | 0 |
|
| clinit.kt:3:1:3:24 | setTopLevelInt | clinit.kt:3:1:3:24 | <set-?> | 0 |
|
||||||
|
| dataClass.kt:0:0:0:0 | copy | dataClass.kt:0:0:0:0 | x | 0 |
|
||||||
|
| dataClass.kt:0:0:0:0 | copy | dataClass.kt:0:0:0:0 | y | 1 |
|
||||||
|
| dataClass.kt:0:0:0:0 | copy$default | dataClass.kt:0:0:0:0 | p0 | 0 |
|
||||||
|
| dataClass.kt:0:0:0:0 | copy$default | dataClass.kt:0:0:0:0 | p1 | 1 |
|
||||||
|
| dataClass.kt:0:0:0:0 | copy$default | dataClass.kt:0:0:0:0 | p2 | 2 |
|
||||||
|
| dataClass.kt:0:0:0:0 | copy$default | dataClass.kt:0:0:0:0 | p3 | 3 |
|
||||||
|
| dataClass.kt:0:0:0:0 | copy$default | dataClass.kt:0:0:0:0 | p4 | 4 |
|
||||||
| dataClass.kt:0:0:0:0 | equals | dataClass.kt:0:0:0:0 | other | 0 |
|
| dataClass.kt:0:0:0:0 | equals | dataClass.kt:0:0:0:0 | other | 0 |
|
||||||
| dataClass.kt:1:1:1:47 | copy | dataClass.kt:1:22:1:31 | x | 0 |
|
|
||||||
| dataClass.kt:1:1:1:47 | copy | dataClass.kt:1:34:1:46 | y | 1 |
|
|
||||||
| dataClass.kt:1:1:1:47 | copy$default | dataClass.kt:1:1:1:47 | p0 | 0 |
|
|
||||||
| dataClass.kt:1:1:1:47 | copy$default | dataClass.kt:1:1:1:47 | p1 | 1 |
|
|
||||||
| dataClass.kt:1:1:1:47 | copy$default | dataClass.kt:1:1:1:47 | p2 | 2 |
|
|
||||||
| dataClass.kt:1:1:1:47 | copy$default | dataClass.kt:1:1:1:47 | p3 | 3 |
|
|
||||||
| dataClass.kt:1:1:1:47 | copy$default | dataClass.kt:1:1:1:47 | p4 | 4 |
|
|
||||||
| dataClass.kt:1:34:1:46 | setY | dataClass.kt:1:34:1:46 | <set-?> | 0 |
|
| dataClass.kt:1:34:1:46 | setY | dataClass.kt:1:34:1:46 | <set-?> | 0 |
|
||||||
| delegates.kt:4:21:6:5 | get | delegates.kt:4:21:6:5 | a0 | 0 |
|
| delegates.kt:4:21:6:5 | get | delegates.kt:4:21:6:5 | a0 | 0 |
|
||||||
| delegates.kt:4:21:6:5 | invoke | delegates.kt:4:21:6:5 | a0 | 0 |
|
| delegates.kt:4:21:6:5 | invoke | delegates.kt:4:21:6:5 | a0 | 0 |
|
||||||
|
|
|
@ -1,17 +1,17 @@
|
||||||
| test.kt:5:3:7:3 | f | test.kt:5:3:7:3 | f$default |
|
| test.kt:5:3:7:3 | f | test.kt:5:3:7:3 | f$default |
|
||||||
| test.kt:19:3:22:3 | f | test.kt:19:3:22:3 | f$default |
|
| test.kt:19:3:22:3 | f | test.kt:19:3:22:3 | f$default |
|
||||||
| test.kt:34:14:36:3 | f | test.kt:34:14:36:3 | f$default |
|
| test.kt:34:3:36:3 | f | test.kt:34:3:36:3 | f$default |
|
||||||
| test.kt:56:3:58:3 | test | test.kt:56:3:58:3 | test$default |
|
| test.kt:56:3:58:3 | test | test.kt:56:3:58:3 | test$default |
|
||||||
| test.kt:68:1:80:1 | TestConstructor | test.kt:68:1:80:1 | TestConstructor |
|
| test.kt:68:22:68:75 | TestConstructor | test.kt:68:22:68:75 | TestConstructor |
|
||||||
| test.kt:86:5:88:5 | f | test.kt:86:5:88:5 | f$default |
|
| test.kt:86:5:88:5 | f | test.kt:86:5:88:5 | f$default |
|
||||||
| test.kt:106:7:108:7 | f | test.kt:106:7:108:7 | f$default |
|
| test.kt:106:7:108:7 | f | test.kt:106:7:108:7 | f$default |
|
||||||
| test.kt:124:3:126:3 | f | test.kt:124:3:126:3 | f$default |
|
| test.kt:124:3:126:3 | f | test.kt:124:3:126:3 | f$default |
|
||||||
| test.kt:135:3:135:43 | testReturn | test.kt:135:3:135:43 | testReturn$default |
|
| test.kt:135:3:135:43 | testReturn | test.kt:135:3:135:43 | testReturn$default |
|
||||||
| test.kt:145:3:147:3 | f | test.kt:145:3:147:3 | f$default |
|
| test.kt:145:3:147:3 | f | test.kt:145:3:147:3 | f$default |
|
||||||
| test.kt:158:3:158:35 | f | test.kt:158:3:158:35 | f$default |
|
| test.kt:158:3:158:35 | f | test.kt:158:3:158:35 | f$default |
|
||||||
| test.kt:159:12:159:44 | g$main | test.kt:159:12:159:44 | g$main$default |
|
| test.kt:159:3:159:44 | g$main | test.kt:159:3:159:44 | g$main$default |
|
||||||
| test.kt:160:13:160:45 | h | test.kt:160:13:160:45 | h$default |
|
| test.kt:160:3:160:45 | h | test.kt:160:3:160:45 | h$default |
|
||||||
| test.kt:161:11:161:43 | i | test.kt:161:11:161:43 | i$default |
|
| test.kt:161:3:161:43 | i | test.kt:161:3:161:43 | i$default |
|
||||||
| test.kt:171:3:171:97 | f | test.kt:171:3:171:97 | f$default |
|
| test.kt:171:3:171:97 | f | test.kt:171:3:171:97 | f$default |
|
||||||
| test.kt:179:3:179:46 | f | test.kt:179:3:179:46 | f$default |
|
| test.kt:179:3:179:46 | f | test.kt:179:3:179:46 | f$default |
|
||||||
| test.kt:180:3:180:34 | f | test.kt:180:3:180:34 | f$default |
|
| test.kt:180:3:180:34 | f | test.kt:180:3:180:34 | f$default |
|
||||||
|
|
|
@ -0,0 +1,2 @@
|
||||||
|
testFailures
|
||||||
|
failures
|
|
@ -0,0 +1,19 @@
|
||||||
|
import java
|
||||||
|
import TestUtilities.InlineExpectationsTest
|
||||||
|
import semmle.code.java.dataflow.DataFlow
|
||||||
|
import semmle.code.java.security.AndroidLocalAuthQuery
|
||||||
|
|
||||||
|
module InsecureAuthTest implements TestSig {
|
||||||
|
string getARelevantTag() { result = "insecure-auth" }
|
||||||
|
|
||||||
|
predicate hasActualResult(Location location, string element, string tag, string value) {
|
||||||
|
tag = "insecure-auth" and
|
||||||
|
exists(AuthenticationSuccessCallback cb | not exists(cb.getAResultUse()) |
|
||||||
|
cb.getLocation() = location and
|
||||||
|
element = cb.toString() and
|
||||||
|
value = ""
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
import MakeTest<InsecureAuthTest>
|
|
@ -0,0 +1,94 @@
|
||||||
|
import android.hardware.biometrics.BiometricPrompt;
|
||||||
|
import android.hardware.fingerprint.FingerprintManager;
|
||||||
|
|
||||||
|
class TestA {
|
||||||
|
public static void useKey(BiometricPrompt.CryptoObject key) {}
|
||||||
|
|
||||||
|
|
||||||
|
// GOOD: result is used
|
||||||
|
class Test1 extends BiometricPrompt.AuthenticationCallback {
|
||||||
|
@Override
|
||||||
|
public void onAuthenticationSucceeded(BiometricPrompt.AuthenticationResult result) {
|
||||||
|
TestA.useKey(result.getCryptoObject());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// BAD: result is not used
|
||||||
|
class Test2 extends BiometricPrompt.AuthenticationCallback {
|
||||||
|
@Override
|
||||||
|
public void onAuthenticationSucceeded(BiometricPrompt.AuthenticationResult result) { // $insecure-auth
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// BAD: result is only used in a super call
|
||||||
|
class Test3 extends BiometricPrompt.AuthenticationCallback {
|
||||||
|
@Override
|
||||||
|
public void onAuthenticationSucceeded(BiometricPrompt.AuthenticationResult result) { // $insecure-auth
|
||||||
|
super.onAuthenticationSucceeded(result);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// GOOD: result is used
|
||||||
|
class Test4 extends BiometricPrompt.AuthenticationCallback {
|
||||||
|
@Override
|
||||||
|
public void onAuthenticationSucceeded(BiometricPrompt.AuthenticationResult result) {
|
||||||
|
super.onAuthenticationSucceeded(result);
|
||||||
|
TestA.useKey(result.getCryptoObject());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// GOOD: result is used in a super call to a class other than the base class
|
||||||
|
class Test5 extends Test1 {
|
||||||
|
@Override
|
||||||
|
public void onAuthenticationSucceeded(BiometricPrompt.AuthenticationResult result) {
|
||||||
|
super.onAuthenticationSucceeded(result);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class TestB {
|
||||||
|
public static void useKey(FingerprintManager.CryptoObject key) {}
|
||||||
|
|
||||||
|
|
||||||
|
// GOOD: result is used
|
||||||
|
class Test1 extends FingerprintManager.AuthenticationCallback {
|
||||||
|
@Override
|
||||||
|
public void onAuthenticationSucceeded(FingerprintManager.AuthenticationResult result) {
|
||||||
|
TestB.useKey(result.getCryptoObject());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// BAD: result is not used
|
||||||
|
class Test2 extends FingerprintManager.AuthenticationCallback {
|
||||||
|
@Override
|
||||||
|
public void onAuthenticationSucceeded(FingerprintManager.AuthenticationResult result) { // $insecure-auth
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// BAD: result is only used in a super call
|
||||||
|
class Test3 extends FingerprintManager.AuthenticationCallback {
|
||||||
|
@Override
|
||||||
|
public void onAuthenticationSucceeded(FingerprintManager.AuthenticationResult result) { // $insecure-auth
|
||||||
|
super.onAuthenticationSucceeded(result);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// GOOD: result is used
|
||||||
|
class Test4 extends FingerprintManager.AuthenticationCallback {
|
||||||
|
@Override
|
||||||
|
public void onAuthenticationSucceeded(FingerprintManager.AuthenticationResult result) {
|
||||||
|
super.onAuthenticationSucceeded(result);
|
||||||
|
TestB.useKey(result.getCryptoObject());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// GOOD: result is used in a super call to a class other than the base class
|
||||||
|
class Test5 extends Test1 {
|
||||||
|
@Override
|
||||||
|
public void onAuthenticationSucceeded(FingerprintManager.AuthenticationResult result) {
|
||||||
|
super.onAuthenticationSucceeded(result);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,47 @@
|
||||||
|
import androidx.biometric.BiometricPrompt;
|
||||||
|
|
||||||
|
class TestC {
|
||||||
|
public static void useKey(BiometricPrompt.CryptoObject key) {}
|
||||||
|
|
||||||
|
|
||||||
|
// GOOD: result is used
|
||||||
|
class Test1 extends BiometricPrompt.AuthenticationCallback {
|
||||||
|
@Override
|
||||||
|
public void onAuthenticationSucceeded(BiometricPrompt.AuthenticationResult result) {
|
||||||
|
TestC.useKey(result.getCryptoObject());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// BAD: result is not used
|
||||||
|
class Test2 extends BiometricPrompt.AuthenticationCallback {
|
||||||
|
@Override
|
||||||
|
public void onAuthenticationSucceeded(BiometricPrompt.AuthenticationResult result) { // $insecure-auth
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// BAD: result is only used in a super call
|
||||||
|
class Test3 extends BiometricPrompt.AuthenticationCallback {
|
||||||
|
@Override
|
||||||
|
public void onAuthenticationSucceeded(BiometricPrompt.AuthenticationResult result) { // $insecure-auth
|
||||||
|
super.onAuthenticationSucceeded(result);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// GOOD: result is used
|
||||||
|
class Test4 extends BiometricPrompt.AuthenticationCallback {
|
||||||
|
@Override
|
||||||
|
public void onAuthenticationSucceeded(BiometricPrompt.AuthenticationResult result) {
|
||||||
|
super.onAuthenticationSucceeded(result);
|
||||||
|
TestC.useKey(result.getCryptoObject());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// GOOD: result is used in a super call to a class other than the base class
|
||||||
|
class Test5 extends Test1 {
|
||||||
|
@Override
|
||||||
|
public void onAuthenticationSucceeded(BiometricPrompt.AuthenticationResult result) {
|
||||||
|
super.onAuthenticationSucceeded(result);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1 @@
|
||||||
|
//semmle-extractor-options: --javac-args -cp ${testdir}/../../../stubs/google-android-9.0.0
|
|
@ -1,7 +1,6 @@
|
||||||
edges
|
edges
|
||||||
| UrlRedirect.java:32:37:32:66 | getParameter(...) : String | UrlRedirect.java:32:25:32:67 | weakCleanup(...) | provenance | |
|
| UrlRedirect.java:32:37:32:66 | getParameter(...) : String | UrlRedirect.java:32:25:32:67 | weakCleanup(...) | provenance | |
|
||||||
| UrlRedirect.java:32:37:32:66 | getParameter(...) : String | UrlRedirect.java:45:28:45:39 | input : String | provenance | |
|
| UrlRedirect.java:32:37:32:66 | getParameter(...) : String | UrlRedirect.java:45:28:45:39 | input : String | provenance | |
|
||||||
| UrlRedirect.java:36:58:36:89 | getParameter(...) : String | UrlRedirect.java:36:25:36:89 | ... + ... | provenance | |
|
|
||||||
| UrlRedirect.java:45:28:45:39 | input : String | UrlRedirect.java:46:10:46:14 | input : String | provenance | |
|
| UrlRedirect.java:45:28:45:39 | input : String | UrlRedirect.java:46:10:46:14 | input : String | provenance | |
|
||||||
| UrlRedirect.java:46:10:46:14 | input : String | UrlRedirect.java:46:10:46:40 | replaceAll(...) : String | provenance | |
|
| UrlRedirect.java:46:10:46:14 | input : String | UrlRedirect.java:46:10:46:40 | replaceAll(...) : String | provenance | |
|
||||||
| mad/Test.java:9:16:9:41 | getParameter(...) : String | mad/Test.java:14:31:14:38 | source(...) : String | provenance | |
|
| mad/Test.java:9:16:9:41 | getParameter(...) : String | mad/Test.java:14:31:14:38 | source(...) : String | provenance | |
|
||||||
|
@ -10,8 +9,6 @@ nodes
|
||||||
| UrlRedirect.java:23:25:23:54 | getParameter(...) | semmle.label | getParameter(...) |
|
| UrlRedirect.java:23:25:23:54 | getParameter(...) | semmle.label | getParameter(...) |
|
||||||
| UrlRedirect.java:32:25:32:67 | weakCleanup(...) | semmle.label | weakCleanup(...) |
|
| UrlRedirect.java:32:25:32:67 | weakCleanup(...) | semmle.label | weakCleanup(...) |
|
||||||
| UrlRedirect.java:32:37:32:66 | getParameter(...) : String | semmle.label | getParameter(...) : String |
|
| UrlRedirect.java:32:37:32:66 | getParameter(...) : String | semmle.label | getParameter(...) : String |
|
||||||
| UrlRedirect.java:36:25:36:89 | ... + ... | semmle.label | ... + ... |
|
|
||||||
| UrlRedirect.java:36:58:36:89 | getParameter(...) : String | semmle.label | getParameter(...) : String |
|
|
||||||
| UrlRedirect.java:39:34:39:63 | getParameter(...) | semmle.label | getParameter(...) |
|
| UrlRedirect.java:39:34:39:63 | getParameter(...) | semmle.label | getParameter(...) |
|
||||||
| UrlRedirect.java:42:43:42:72 | getParameter(...) | semmle.label | getParameter(...) |
|
| UrlRedirect.java:42:43:42:72 | getParameter(...) | semmle.label | getParameter(...) |
|
||||||
| UrlRedirect.java:45:28:45:39 | input : String | semmle.label | input : String |
|
| UrlRedirect.java:45:28:45:39 | input : String | semmle.label | input : String |
|
||||||
|
@ -25,7 +22,6 @@ subpaths
|
||||||
#select
|
#select
|
||||||
| UrlRedirect.java:23:25:23:54 | getParameter(...) | UrlRedirect.java:23:25:23:54 | getParameter(...) | UrlRedirect.java:23:25:23:54 | getParameter(...) | Untrusted URL redirection depends on a $@. | UrlRedirect.java:23:25:23:54 | getParameter(...) | user-provided value |
|
| UrlRedirect.java:23:25:23:54 | getParameter(...) | UrlRedirect.java:23:25:23:54 | getParameter(...) | UrlRedirect.java:23:25:23:54 | getParameter(...) | Untrusted URL redirection depends on a $@. | UrlRedirect.java:23:25:23:54 | getParameter(...) | user-provided value |
|
||||||
| UrlRedirect.java:32:25:32:67 | weakCleanup(...) | UrlRedirect.java:32:37:32:66 | getParameter(...) : String | UrlRedirect.java:32:25:32:67 | weakCleanup(...) | Untrusted URL redirection depends on a $@. | UrlRedirect.java:32:37:32:66 | getParameter(...) | user-provided value |
|
| UrlRedirect.java:32:25:32:67 | weakCleanup(...) | UrlRedirect.java:32:37:32:66 | getParameter(...) : String | UrlRedirect.java:32:25:32:67 | weakCleanup(...) | Untrusted URL redirection depends on a $@. | UrlRedirect.java:32:37:32:66 | getParameter(...) | user-provided value |
|
||||||
| UrlRedirect.java:36:25:36:89 | ... + ... | UrlRedirect.java:36:58:36:89 | getParameter(...) : String | UrlRedirect.java:36:25:36:89 | ... + ... | Untrusted URL redirection depends on a $@. | UrlRedirect.java:36:58:36:89 | getParameter(...) | user-provided value |
|
|
||||||
| UrlRedirect.java:39:34:39:63 | getParameter(...) | UrlRedirect.java:39:34:39:63 | getParameter(...) | UrlRedirect.java:39:34:39:63 | getParameter(...) | Untrusted URL redirection depends on a $@. | UrlRedirect.java:39:34:39:63 | getParameter(...) | user-provided value |
|
| UrlRedirect.java:39:34:39:63 | getParameter(...) | UrlRedirect.java:39:34:39:63 | getParameter(...) | UrlRedirect.java:39:34:39:63 | getParameter(...) | Untrusted URL redirection depends on a $@. | UrlRedirect.java:39:34:39:63 | getParameter(...) | user-provided value |
|
||||||
| UrlRedirect.java:42:43:42:72 | getParameter(...) | UrlRedirect.java:42:43:42:72 | getParameter(...) | UrlRedirect.java:42:43:42:72 | getParameter(...) | Untrusted URL redirection depends on a $@. | UrlRedirect.java:42:43:42:72 | getParameter(...) | user-provided value |
|
| UrlRedirect.java:42:43:42:72 | getParameter(...) | UrlRedirect.java:42:43:42:72 | getParameter(...) | UrlRedirect.java:42:43:42:72 | getParameter(...) | Untrusted URL redirection depends on a $@. | UrlRedirect.java:42:43:42:72 | getParameter(...) | user-provided value |
|
||||||
| mad/Test.java:14:22:14:38 | (...)... | mad/Test.java:9:16:9:41 | getParameter(...) : String | mad/Test.java:14:22:14:38 | (...)... | Untrusted URL redirection depends on a $@. | mad/Test.java:9:16:9:41 | getParameter(...) | user-provided value |
|
| mad/Test.java:14:22:14:38 | (...)... | mad/Test.java:9:16:9:41 | getParameter(...) : String | mad/Test.java:14:22:14:38 | (...)... | Untrusted URL redirection depends on a $@. | mad/Test.java:9:16:9:41 | getParameter(...) | user-provided value |
|
||||||
|
|
|
@ -31,7 +31,7 @@ public class UrlRedirect extends HttpServlet {
|
||||||
// if the argument is "hthttp://tp://malicious.com"
|
// if the argument is "hthttp://tp://malicious.com"
|
||||||
response.sendRedirect(weakCleanup(request.getParameter("target")));
|
response.sendRedirect(weakCleanup(request.getParameter("target")));
|
||||||
|
|
||||||
// FALSE POSITIVE: the user input is not used in a position that allows it to dictate
|
// GOOD: the user input is not used in a position that allows it to dictate
|
||||||
// the target of the redirect
|
// the target of the redirect
|
||||||
response.sendRedirect("http://example.com?username=" + request.getParameter("username"));
|
response.sendRedirect("http://example.com?username=" + request.getParameter("username"));
|
||||||
|
|
||||||
|
|
69
java/ql/test/stubs/google-android-9.0.0/android/hardware/biometrics/BiometricPrompt.java
сгенерированный
Normal file
69
java/ql/test/stubs/google-android-9.0.0/android/hardware/biometrics/BiometricPrompt.java
сгенерированный
Normal file
|
@ -0,0 +1,69 @@
|
||||||
|
// Generated automatically from android.hardware.biometrics.BiometricPrompt for testing purposes
|
||||||
|
|
||||||
|
package android.hardware.biometrics;
|
||||||
|
|
||||||
|
import android.os.CancellationSignal;
|
||||||
|
import android.security.identity.IdentityCredential;
|
||||||
|
import java.security.Signature;
|
||||||
|
import java.util.concurrent.Executor;
|
||||||
|
import javax.crypto.Cipher;
|
||||||
|
import javax.crypto.Mac;
|
||||||
|
|
||||||
|
public class BiometricPrompt
|
||||||
|
{
|
||||||
|
protected BiometricPrompt() {}
|
||||||
|
abstract static public class AuthenticationCallback
|
||||||
|
{
|
||||||
|
public AuthenticationCallback(){}
|
||||||
|
public void onAuthenticationError(int p0, CharSequence p1){}
|
||||||
|
public void onAuthenticationFailed(){}
|
||||||
|
public void onAuthenticationHelp(int p0, CharSequence p1){}
|
||||||
|
public void onAuthenticationSucceeded(BiometricPrompt.AuthenticationResult p0){}
|
||||||
|
}
|
||||||
|
public CharSequence getDescription(){ return null; }
|
||||||
|
public CharSequence getNegativeButtonText(){ return null; }
|
||||||
|
public CharSequence getSubtitle(){ return null; }
|
||||||
|
public CharSequence getTitle(){ return null; }
|
||||||
|
public boolean isConfirmationRequired(){ return false; }
|
||||||
|
public int getAllowedAuthenticators(){ return 0; }
|
||||||
|
public static int AUTHENTICATION_RESULT_TYPE_BIOMETRIC = 0;
|
||||||
|
public static int AUTHENTICATION_RESULT_TYPE_DEVICE_CREDENTIAL = 0;
|
||||||
|
public static int BIOMETRIC_ACQUIRED_GOOD = 0;
|
||||||
|
public static int BIOMETRIC_ACQUIRED_IMAGER_DIRTY = 0;
|
||||||
|
public static int BIOMETRIC_ACQUIRED_INSUFFICIENT = 0;
|
||||||
|
public static int BIOMETRIC_ACQUIRED_PARTIAL = 0;
|
||||||
|
public static int BIOMETRIC_ACQUIRED_TOO_FAST = 0;
|
||||||
|
public static int BIOMETRIC_ACQUIRED_TOO_SLOW = 0;
|
||||||
|
public static int BIOMETRIC_ERROR_CANCELED = 0;
|
||||||
|
public static int BIOMETRIC_ERROR_HW_NOT_PRESENT = 0;
|
||||||
|
public static int BIOMETRIC_ERROR_HW_UNAVAILABLE = 0;
|
||||||
|
public static int BIOMETRIC_ERROR_LOCKOUT = 0;
|
||||||
|
public static int BIOMETRIC_ERROR_LOCKOUT_PERMANENT = 0;
|
||||||
|
public static int BIOMETRIC_ERROR_NO_BIOMETRICS = 0;
|
||||||
|
public static int BIOMETRIC_ERROR_NO_DEVICE_CREDENTIAL = 0;
|
||||||
|
public static int BIOMETRIC_ERROR_NO_SPACE = 0;
|
||||||
|
public static int BIOMETRIC_ERROR_SECURITY_UPDATE_REQUIRED = 0;
|
||||||
|
public static int BIOMETRIC_ERROR_TIMEOUT = 0;
|
||||||
|
public static int BIOMETRIC_ERROR_UNABLE_TO_PROCESS = 0;
|
||||||
|
public static int BIOMETRIC_ERROR_USER_CANCELED = 0;
|
||||||
|
public static int BIOMETRIC_ERROR_VENDOR = 0;
|
||||||
|
public void authenticate(BiometricPrompt.CryptoObject p0, CancellationSignal p1, Executor p2, BiometricPrompt.AuthenticationCallback p3){}
|
||||||
|
public void authenticate(CancellationSignal p0, Executor p1, BiometricPrompt.AuthenticationCallback p2){}
|
||||||
|
static public class AuthenticationResult
|
||||||
|
{
|
||||||
|
public BiometricPrompt.CryptoObject getCryptoObject(){ return null; }
|
||||||
|
public int getAuthenticationType(){ return 0; }
|
||||||
|
}
|
||||||
|
static public class CryptoObject
|
||||||
|
{
|
||||||
|
protected CryptoObject() {}
|
||||||
|
public Cipher getCipher(){ return null; }
|
||||||
|
public CryptoObject(Cipher p0){}
|
||||||
|
public CryptoObject(IdentityCredential p0){}
|
||||||
|
public CryptoObject(Mac p0){}
|
||||||
|
public CryptoObject(Signature p0){}
|
||||||
|
public IdentityCredential getIdentityCredential(){ return null; }
|
||||||
|
public Mac getMac(){ return null; }
|
||||||
|
public Signature getSignature(){ return null; }
|
||||||
|
}
|
||||||
|
}
|
55
java/ql/test/stubs/google-android-9.0.0/android/hardware/fingerprint/FingerprintManager.java
сгенерированный
Normal file
55
java/ql/test/stubs/google-android-9.0.0/android/hardware/fingerprint/FingerprintManager.java
сгенерированный
Normal file
|
@ -0,0 +1,55 @@
|
||||||
|
// Generated automatically from android.hardware.fingerprint.FingerprintManager for testing purposes
|
||||||
|
|
||||||
|
package android.hardware.fingerprint;
|
||||||
|
|
||||||
|
import android.os.CancellationSignal;
|
||||||
|
import android.os.Handler;
|
||||||
|
import java.security.Signature;
|
||||||
|
import javax.crypto.Cipher;
|
||||||
|
import javax.crypto.Mac;
|
||||||
|
|
||||||
|
public class FingerprintManager
|
||||||
|
{
|
||||||
|
abstract static public class AuthenticationCallback
|
||||||
|
{
|
||||||
|
public AuthenticationCallback(){}
|
||||||
|
public void onAuthenticationError(int p0, CharSequence p1){}
|
||||||
|
public void onAuthenticationFailed(){}
|
||||||
|
public void onAuthenticationHelp(int p0, CharSequence p1){}
|
||||||
|
public void onAuthenticationSucceeded(FingerprintManager.AuthenticationResult p0){}
|
||||||
|
}
|
||||||
|
public boolean hasEnrolledFingerprints(){ return false; }
|
||||||
|
public boolean isHardwareDetected(){ return false; }
|
||||||
|
public static int FINGERPRINT_ACQUIRED_GOOD = 0;
|
||||||
|
public static int FINGERPRINT_ACQUIRED_IMAGER_DIRTY = 0;
|
||||||
|
public static int FINGERPRINT_ACQUIRED_INSUFFICIENT = 0;
|
||||||
|
public static int FINGERPRINT_ACQUIRED_PARTIAL = 0;
|
||||||
|
public static int FINGERPRINT_ACQUIRED_TOO_FAST = 0;
|
||||||
|
public static int FINGERPRINT_ACQUIRED_TOO_SLOW = 0;
|
||||||
|
public static int FINGERPRINT_ERROR_CANCELED = 0;
|
||||||
|
public static int FINGERPRINT_ERROR_HW_NOT_PRESENT = 0;
|
||||||
|
public static int FINGERPRINT_ERROR_HW_UNAVAILABLE = 0;
|
||||||
|
public static int FINGERPRINT_ERROR_LOCKOUT = 0;
|
||||||
|
public static int FINGERPRINT_ERROR_LOCKOUT_PERMANENT = 0;
|
||||||
|
public static int FINGERPRINT_ERROR_NO_FINGERPRINTS = 0;
|
||||||
|
public static int FINGERPRINT_ERROR_NO_SPACE = 0;
|
||||||
|
public static int FINGERPRINT_ERROR_TIMEOUT = 0;
|
||||||
|
public static int FINGERPRINT_ERROR_UNABLE_TO_PROCESS = 0;
|
||||||
|
public static int FINGERPRINT_ERROR_USER_CANCELED = 0;
|
||||||
|
public static int FINGERPRINT_ERROR_VENDOR = 0;
|
||||||
|
public void authenticate(FingerprintManager.CryptoObject p0, CancellationSignal p1, int p2, FingerprintManager.AuthenticationCallback p3, Handler p4){}
|
||||||
|
static public class AuthenticationResult
|
||||||
|
{
|
||||||
|
public FingerprintManager.CryptoObject getCryptoObject(){ return null; }
|
||||||
|
}
|
||||||
|
static public class CryptoObject
|
||||||
|
{
|
||||||
|
protected CryptoObject() {}
|
||||||
|
public Cipher getCipher(){ return null; }
|
||||||
|
public CryptoObject(Cipher p0){}
|
||||||
|
public CryptoObject(Mac p0){}
|
||||||
|
public CryptoObject(Signature p0){}
|
||||||
|
public Mac getMac(){ return null; }
|
||||||
|
public Signature getSignature(){ return null; }
|
||||||
|
}
|
||||||
|
}
|
|
@ -15,9 +15,9 @@ import java.util.ArrayList;
|
||||||
|
|
||||||
public class Bundle extends BaseBundle implements Cloneable, Parcelable
|
public class Bundle extends BaseBundle implements Cloneable, Parcelable
|
||||||
{
|
{
|
||||||
public <T extends Parcelable> ArrayList<T> getParcelableArrayList(String p0){ return null; }
|
|
||||||
public <T extends Parcelable> SparseArray<T> getSparseParcelableArray(String p0){ return null; }
|
|
||||||
public <T extends Parcelable> T getParcelable(String p0){ return null; }
|
public <T extends Parcelable> T getParcelable(String p0){ return null; }
|
||||||
|
public <T extends Parcelable> android.util.SparseArray<T> getSparseParcelableArray(String p0){ return null; }
|
||||||
|
public <T extends Parcelable> java.util.ArrayList<T> getParcelableArrayList(String p0){ return null; }
|
||||||
public ArrayList<CharSequence> getCharSequenceArrayList(String p0){ return null; }
|
public ArrayList<CharSequence> getCharSequenceArrayList(String p0){ return null; }
|
||||||
public ArrayList<Integer> getIntegerArrayList(String p0){ return null; }
|
public ArrayList<Integer> getIntegerArrayList(String p0){ return null; }
|
||||||
public ArrayList<String> getStringArrayList(String p0){ return null; }
|
public ArrayList<String> getStringArrayList(String p0){ return null; }
|
||||||
|
|
|
@ -24,24 +24,24 @@ public class Parcel
|
||||||
{
|
{
|
||||||
protected Parcel() {}
|
protected Parcel() {}
|
||||||
protected void finalize(){}
|
protected void finalize(){}
|
||||||
public <T extends Parcelable> ArrayMap<String, T> createTypedArrayMap(Parcelable.Creator<T> p0){ return null; }
|
|
||||||
public <T extends Parcelable> List<T> readParcelableList(List<T> p0, ClassLoader p1){ return null; }
|
|
||||||
public <T extends Parcelable> SparseArray<T> createTypedSparseArray(Parcelable.Creator<T> p0){ return null; }
|
|
||||||
public <T extends Parcelable> T readParcelable(ClassLoader p0){ return null; }
|
public <T extends Parcelable> T readParcelable(ClassLoader p0){ return null; }
|
||||||
|
public <T extends Parcelable> android.util.ArrayMap<String, T> createTypedArrayMap(Parcelable.Creator<T> p0){ return null; }
|
||||||
|
public <T extends Parcelable> android.util.SparseArray<T> createTypedSparseArray(Parcelable.Creator<T> p0){ return null; }
|
||||||
|
public <T extends Parcelable> java.util.List<T> readParcelableList(java.util.List<T> p0, ClassLoader p1){ return null; }
|
||||||
public <T extends Parcelable> void writeParcelableArray(T[] p0, int p1){}
|
public <T extends Parcelable> void writeParcelableArray(T[] p0, int p1){}
|
||||||
public <T extends Parcelable> void writeParcelableList(List<T> p0, int p1){}
|
public <T extends Parcelable> void writeParcelableList(java.util.List<T> p0, int p1){}
|
||||||
public <T extends Parcelable> void writeTypedArray(T[] p0, int p1){}
|
public <T extends Parcelable> void writeTypedArray(T[] p0, int p1){}
|
||||||
public <T extends Parcelable> void writeTypedArrayMap(ArrayMap<String, T> p0, int p1){}
|
public <T extends Parcelable> void writeTypedArrayMap(android.util.ArrayMap<String, T> p0, int p1){}
|
||||||
public <T extends Parcelable> void writeTypedList(List<T> p0){}
|
public <T extends Parcelable> void writeTypedList(java.util.List<T> p0){}
|
||||||
public <T extends Parcelable> void writeTypedObject(T p0, int p1){}
|
public <T extends Parcelable> void writeTypedObject(T p0, int p1){}
|
||||||
public <T extends Parcelable> void writeTypedSparseArray(SparseArray<T> p0, int p1){}
|
public <T extends Parcelable> void writeTypedSparseArray(android.util.SparseArray<T> p0, int p1){}
|
||||||
public <T> ArrayList<T> createTypedArrayList(Parcelable.Creator<T> p0){ return null; }
|
|
||||||
public <T> SparseArray<T> readSparseArray(ClassLoader p0){ return null; }
|
|
||||||
public <T> T readTypedObject(Parcelable.Creator<T> p0){ return null; }
|
public <T> T readTypedObject(Parcelable.Creator<T> p0){ return null; }
|
||||||
public <T> T[] createTypedArray(Parcelable.Creator<T> p0){ return null; }
|
public <T> T[] createTypedArray(Parcelable.Creator<T> p0){ return null; }
|
||||||
|
public <T> android.util.SparseArray<T> readSparseArray(ClassLoader p0){ return null; }
|
||||||
|
public <T> java.util.ArrayList<T> createTypedArrayList(Parcelable.Creator<T> p0){ return null; }
|
||||||
public <T> void readTypedArray(T[] p0, Parcelable.Creator<T> p1){}
|
public <T> void readTypedArray(T[] p0, Parcelable.Creator<T> p1){}
|
||||||
public <T> void readTypedList(List<T> p0, Parcelable.Creator<T> p1){}
|
public <T> void readTypedList(java.util.List<T> p0, Parcelable.Creator<T> p1){}
|
||||||
public <T> void writeSparseArray(SparseArray<T> p0){}
|
public <T> void writeSparseArray(android.util.SparseArray<T> p0){}
|
||||||
public ArrayList readArrayList(ClassLoader p0){ return null; }
|
public ArrayList readArrayList(ClassLoader p0){ return null; }
|
||||||
public ArrayList<IBinder> createBinderArrayList(){ return null; }
|
public ArrayList<IBinder> createBinderArrayList(){ return null; }
|
||||||
public ArrayList<String> createStringArrayList(){ return null; }
|
public ArrayList<String> createStringArrayList(){ return null; }
|
||||||
|
|
32
java/ql/test/stubs/google-android-9.0.0/android/security/identity/IdentityCredential.java
сгенерированный
Normal file
32
java/ql/test/stubs/google-android-9.0.0/android/security/identity/IdentityCredential.java
сгенерированный
Normal file
|
@ -0,0 +1,32 @@
|
||||||
|
// Generated automatically from android.security.identity.IdentityCredential for testing purposes
|
||||||
|
|
||||||
|
package android.security.identity;
|
||||||
|
|
||||||
|
import android.security.identity.PersonalizationData;
|
||||||
|
import android.security.identity.ResultData;
|
||||||
|
import java.security.KeyPair;
|
||||||
|
import java.security.PublicKey;
|
||||||
|
import java.security.cert.X509Certificate;
|
||||||
|
import java.time.Instant;
|
||||||
|
import java.util.Collection;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
abstract public class IdentityCredential
|
||||||
|
{
|
||||||
|
public abstract Collection<X509Certificate> getAuthKeysNeedingCertification();
|
||||||
|
public abstract Collection<X509Certificate> getCredentialKeyCertificateChain();
|
||||||
|
public abstract KeyPair createEphemeralKeyPair();
|
||||||
|
public abstract ResultData getEntries(byte[] p0, Map<String, Collection<String>> p1, byte[] p2, byte[] p3);
|
||||||
|
public abstract byte[] decryptMessageFromReader(byte[] p0);
|
||||||
|
public abstract byte[] encryptMessageToReader(byte[] p0);
|
||||||
|
public abstract int[] getAuthenticationDataUsageCount();
|
||||||
|
public abstract void setAllowUsingExhaustedKeys(boolean p0);
|
||||||
|
public abstract void setAvailableAuthenticationKeys(int p0, int p1);
|
||||||
|
public abstract void setReaderEphemeralPublicKey(PublicKey p0);
|
||||||
|
public abstract void storeStaticAuthenticationData(X509Certificate p0, byte[] p1);
|
||||||
|
public byte[] delete(byte[] p0){ return null; }
|
||||||
|
public byte[] proveOwnership(byte[] p0){ return null; }
|
||||||
|
public byte[] update(PersonalizationData p0){ return null; }
|
||||||
|
public void setAllowUsingExpiredKeys(boolean p0){}
|
||||||
|
public void storeStaticAuthenticationData(X509Certificate p0, Instant p1, byte[] p2){}
|
||||||
|
}
|
9
java/ql/test/stubs/google-android-9.0.0/android/security/identity/PersonalizationData.java
сгенерированный
Normal file
9
java/ql/test/stubs/google-android-9.0.0/android/security/identity/PersonalizationData.java
сгенерированный
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
// Generated automatically from android.security.identity.PersonalizationData for testing purposes
|
||||||
|
|
||||||
|
package android.security.identity;
|
||||||
|
|
||||||
|
|
||||||
|
public class PersonalizationData
|
||||||
|
{
|
||||||
|
protected PersonalizationData() {}
|
||||||
|
}
|
9
java/ql/test/stubs/google-android-9.0.0/android/security/identity/PresentationSession.java
сгенерированный
Normal file
9
java/ql/test/stubs/google-android-9.0.0/android/security/identity/PresentationSession.java
сгенерированный
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
// Generated automatically from android.security.identity.PresentationSession for testing purposes
|
||||||
|
|
||||||
|
package android.security.identity;
|
||||||
|
|
||||||
|
|
||||||
|
public class PresentationSession
|
||||||
|
{
|
||||||
|
protected PresentationSession() {}
|
||||||
|
}
|
24
java/ql/test/stubs/google-android-9.0.0/android/security/identity/ResultData.java
сгенерированный
Normal file
24
java/ql/test/stubs/google-android-9.0.0/android/security/identity/ResultData.java
сгенерированный
Normal file
|
@ -0,0 +1,24 @@
|
||||||
|
// Generated automatically from android.security.identity.ResultData for testing purposes
|
||||||
|
|
||||||
|
package android.security.identity;
|
||||||
|
|
||||||
|
import java.util.Collection;
|
||||||
|
|
||||||
|
abstract public class ResultData
|
||||||
|
{
|
||||||
|
public abstract Collection<String> getEntryNames(String p0);
|
||||||
|
public abstract Collection<String> getNamespaces();
|
||||||
|
public abstract Collection<String> getRetrievedEntryNames(String p0);
|
||||||
|
public abstract byte[] getAuthenticatedData();
|
||||||
|
public abstract byte[] getEntry(String p0, String p1);
|
||||||
|
public abstract byte[] getMessageAuthenticationCode();
|
||||||
|
public abstract byte[] getStaticAuthenticationData();
|
||||||
|
public abstract int getStatus(String p0, String p1);
|
||||||
|
public static int STATUS_NOT_IN_REQUEST_MESSAGE = 0;
|
||||||
|
public static int STATUS_NOT_REQUESTED = 0;
|
||||||
|
public static int STATUS_NO_ACCESS_CONTROL_PROFILES = 0;
|
||||||
|
public static int STATUS_NO_SUCH_ENTRY = 0;
|
||||||
|
public static int STATUS_OK = 0;
|
||||||
|
public static int STATUS_READER_AUTHENTICATION_FAILED = 0;
|
||||||
|
public static int STATUS_USER_AUTHENTICATION_FAILED = 0;
|
||||||
|
}
|
|
@ -6,15 +6,12 @@ import java.util.Collection;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
public class ArrayMap<K, V> implements Map<K, V>
|
public class ArrayMap<K, V> implements java.util.Map<K, V>
|
||||||
{
|
{
|
||||||
public ArrayMap(){}
|
public ArrayMap(){}
|
||||||
public ArrayMap(ArrayMap<K, V> p0){}
|
public ArrayMap(ArrayMap<K, V> p0){}
|
||||||
public ArrayMap(int p0){}
|
public ArrayMap(int p0){}
|
||||||
public Collection<V> values(){ return null; }
|
|
||||||
public K keyAt(int p0){ return null; }
|
public K keyAt(int p0){ return null; }
|
||||||
public Set<K> keySet(){ return null; }
|
|
||||||
public Set<Map.Entry<K, V>> entrySet(){ return null; }
|
|
||||||
public String toString(){ return null; }
|
public String toString(){ return null; }
|
||||||
public V get(Object p0){ return null; }
|
public V get(Object p0){ return null; }
|
||||||
public V put(K p0, V p1){ return null; }
|
public V put(K p0, V p1){ return null; }
|
||||||
|
@ -33,8 +30,11 @@ public class ArrayMap<K, V> implements Map<K, V>
|
||||||
public int indexOfKey(Object p0){ return 0; }
|
public int indexOfKey(Object p0){ return 0; }
|
||||||
public int indexOfValue(Object p0){ return 0; }
|
public int indexOfValue(Object p0){ return 0; }
|
||||||
public int size(){ return 0; }
|
public int size(){ return 0; }
|
||||||
|
public java.util.Collection<V> values(){ return null; }
|
||||||
|
public java.util.Set<K> keySet(){ return null; }
|
||||||
|
public java.util.Set<Map.Entry<K, V>> entrySet(){ return null; }
|
||||||
public void clear(){}
|
public void clear(){}
|
||||||
public void ensureCapacity(int p0){}
|
public void ensureCapacity(int p0){}
|
||||||
public void putAll(ArrayMap<? extends K, ? extends V> p0){}
|
public void putAll(ArrayMap<? extends K, ? extends V> p0){}
|
||||||
public void putAll(Map<? extends K, ? extends V> p0){}
|
public void putAll(java.util.Map<? extends K, ? extends V> p0){}
|
||||||
}
|
}
|
||||||
|
|
79
java/ql/test/stubs/google-android-9.0.0/androidx/biometric/BiometricPrompt.java
сгенерированный
Normal file
79
java/ql/test/stubs/google-android-9.0.0/androidx/biometric/BiometricPrompt.java
сгенерированный
Normal file
|
@ -0,0 +1,79 @@
|
||||||
|
// Generated automatically from androidx.biometric.BiometricPrompt for testing purposes
|
||||||
|
|
||||||
|
package androidx.biometric;
|
||||||
|
|
||||||
|
import android.security.identity.IdentityCredential;
|
||||||
|
import android.security.identity.PresentationSession;
|
||||||
|
import androidx.fragment.app.Fragment;
|
||||||
|
import androidx.fragment.app.FragmentActivity;
|
||||||
|
import java.security.Signature;
|
||||||
|
import java.util.concurrent.Executor;
|
||||||
|
import javax.crypto.Cipher;
|
||||||
|
import javax.crypto.Mac;
|
||||||
|
|
||||||
|
public class BiometricPrompt
|
||||||
|
{
|
||||||
|
protected BiometricPrompt() {}
|
||||||
|
abstract static public class AuthenticationCallback
|
||||||
|
{
|
||||||
|
public AuthenticationCallback(){}
|
||||||
|
public void onAuthenticationError(int p0, CharSequence p1){}
|
||||||
|
public void onAuthenticationFailed(){}
|
||||||
|
public void onAuthenticationSucceeded(BiometricPrompt.AuthenticationResult p0){}
|
||||||
|
}
|
||||||
|
public BiometricPrompt(Fragment p0, BiometricPrompt.AuthenticationCallback p1){}
|
||||||
|
public BiometricPrompt(Fragment p0, Executor p1, BiometricPrompt.AuthenticationCallback p2){}
|
||||||
|
public BiometricPrompt(FragmentActivity p0, BiometricPrompt.AuthenticationCallback p1){}
|
||||||
|
public BiometricPrompt(FragmentActivity p0, Executor p1, BiometricPrompt.AuthenticationCallback p2){}
|
||||||
|
public static int AUTHENTICATION_RESULT_TYPE_BIOMETRIC = 0;
|
||||||
|
public static int AUTHENTICATION_RESULT_TYPE_DEVICE_CREDENTIAL = 0;
|
||||||
|
public static int AUTHENTICATION_RESULT_TYPE_UNKNOWN = 0;
|
||||||
|
public static int ERROR_CANCELED = 0;
|
||||||
|
public static int ERROR_HW_NOT_PRESENT = 0;
|
||||||
|
public static int ERROR_HW_UNAVAILABLE = 0;
|
||||||
|
public static int ERROR_LOCKOUT = 0;
|
||||||
|
public static int ERROR_LOCKOUT_PERMANENT = 0;
|
||||||
|
public static int ERROR_NEGATIVE_BUTTON = 0;
|
||||||
|
public static int ERROR_NO_BIOMETRICS = 0;
|
||||||
|
public static int ERROR_NO_DEVICE_CREDENTIAL = 0;
|
||||||
|
public static int ERROR_NO_SPACE = 0;
|
||||||
|
public static int ERROR_SECURITY_UPDATE_REQUIRED = 0;
|
||||||
|
public static int ERROR_TIMEOUT = 0;
|
||||||
|
public static int ERROR_UNABLE_TO_PROCESS = 0;
|
||||||
|
public static int ERROR_USER_CANCELED = 0;
|
||||||
|
public static int ERROR_VENDOR = 0;
|
||||||
|
public void authenticate(BiometricPrompt.PromptInfo p0){}
|
||||||
|
public void authenticate(BiometricPrompt.PromptInfo p0, BiometricPrompt.CryptoObject p1){}
|
||||||
|
public void cancelAuthentication(){}
|
||||||
|
static public class AuthenticationResult
|
||||||
|
{
|
||||||
|
protected AuthenticationResult() {}
|
||||||
|
public BiometricPrompt.CryptoObject getCryptoObject(){ return null; }
|
||||||
|
public int getAuthenticationType(){ return 0; }
|
||||||
|
}
|
||||||
|
static public class CryptoObject
|
||||||
|
{
|
||||||
|
protected CryptoObject() {}
|
||||||
|
public Cipher getCipher(){ return null; }
|
||||||
|
public CryptoObject(Cipher p0){}
|
||||||
|
public CryptoObject(IdentityCredential p0){}
|
||||||
|
public CryptoObject(Mac p0){}
|
||||||
|
public CryptoObject(PresentationSession p0){}
|
||||||
|
public CryptoObject(Signature p0){}
|
||||||
|
public IdentityCredential getIdentityCredential(){ return null; }
|
||||||
|
public Mac getMac(){ return null; }
|
||||||
|
public PresentationSession getPresentationSession(){ return null; }
|
||||||
|
public Signature getSignature(){ return null; }
|
||||||
|
}
|
||||||
|
static public class PromptInfo
|
||||||
|
{
|
||||||
|
protected PromptInfo() {}
|
||||||
|
public CharSequence getDescription(){ return null; }
|
||||||
|
public CharSequence getNegativeButtonText(){ return null; }
|
||||||
|
public CharSequence getSubtitle(){ return null; }
|
||||||
|
public CharSequence getTitle(){ return null; }
|
||||||
|
public boolean isConfirmationRequired(){ return false; }
|
||||||
|
public boolean isDeviceCredentialAllowed(){ return false; }
|
||||||
|
public int getAllowedAuthenticators(){ return 0; }
|
||||||
|
}
|
||||||
|
}
|
|
@ -46,7 +46,8 @@ class SpuriousArguments extends Expr {
|
||||||
|
|
||||||
SpuriousArguments() {
|
SpuriousArguments() {
|
||||||
this = invk.getArgument(maxArity(invk)).asExpr() and
|
this = invk.getArgument(maxArity(invk)).asExpr() and
|
||||||
not invk.isIncomplete()
|
not invk.isIncomplete() and
|
||||||
|
not invk.getAstNode() instanceof TaggedTemplateExpr
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -130,3 +130,12 @@ function sum2() {
|
||||||
|
|
||||||
// OK
|
// OK
|
||||||
sum2(1, 2, 3);
|
sum2(1, 2, 3);
|
||||||
|
|
||||||
|
const $ = function (x, arr) {
|
||||||
|
console.log(x, arr);
|
||||||
|
};
|
||||||
|
|
||||||
|
// OK
|
||||||
|
async function tagThing(repoUrl, directory) {
|
||||||
|
await $`git clone ${repoUrl} ${directory}`;
|
||||||
|
}
|
||||||
|
|
|
@ -374,7 +374,8 @@ predicate controllerTemplateFile(ActionControllerClass cls, ErbFile templateFile
|
||||||
controllerPath = getActionControllerClassRelativePath(cls) and
|
controllerPath = getActionControllerClassRelativePath(cls) and
|
||||||
// `sourcePrefix` is either a prefix path ending in a slash, or empty if
|
// `sourcePrefix` is either a prefix path ending in a slash, or empty if
|
||||||
// the rails app is at the source root
|
// the rails app is at the source root
|
||||||
sourcePrefix = [controllerPath.regexpCapture("^(.*/)app/controllers/(?:.*?)/(?:[^/]*)$", 1), ""] and
|
sourcePrefix =
|
||||||
|
[controllerPath.regexpCapture("^(.*/)app/controllers/(?:[^/]+/)?(?:[^/]*)$", 1), ""] and
|
||||||
controllerPath = sourcePrefix + "app/controllers/" + subPath + "_controller.rb"
|
controllerPath = sourcePrefix + "app/controllers/" + subPath + "_controller.rb"
|
||||||
|
|
|
|
||||||
sourcePrefix + "app/views/" + subPath = templateFile.getParentContainer().getRelativePath()
|
sourcePrefix + "app/views/" + subPath = templateFile.getParentContainer().getRelativePath()
|
||||||
|
|
|
@ -77,7 +77,11 @@ private predicate isUnlikelyExternalCall(API::MethodAccessNode node) {
|
||||||
}
|
}
|
||||||
|
|
||||||
private API::Node activeRecordConnectionInstance() {
|
private API::Node activeRecordConnectionInstance() {
|
||||||
result = activeRecordBaseClass().getReturn("connection")
|
result =
|
||||||
|
[
|
||||||
|
activeRecordBaseClass().getReturn("connection"),
|
||||||
|
activeRecordBaseClass().getInstance().getReturn("connection")
|
||||||
|
]
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -1,11 +1,11 @@
|
||||||
actionControllerControllerClasses
|
actionControllerControllerClasses
|
||||||
| controllers/application_controller.rb:1:1:13:3 | ApplicationController |
|
| app/controllers/application_controller.rb:1:1:13:3 | ApplicationController |
|
||||||
| controllers/comments_controller.rb:1:1:104:3 | CommentsController |
|
| app/controllers/comments_controller.rb:1:1:104:3 | CommentsController |
|
||||||
| controllers/foo/bars_controller.rb:3:1:46:3 | BarsController |
|
| app/controllers/foo/bars_controller.rb:3:1:46:3 | BarsController |
|
||||||
| controllers/photos_controller.rb:1:1:10:3 | PhotosController |
|
| app/controllers/photos_controller.rb:1:1:10:3 | PhotosController |
|
||||||
| controllers/posts_controller.rb:1:1:32:3 | PostsController |
|
| app/controllers/posts_controller.rb:1:1:32:3 | PostsController |
|
||||||
| controllers/tags_controller.rb:1:1:2:3 | TagsController |
|
| app/controllers/tags_controller.rb:1:1:2:3 | TagsController |
|
||||||
| controllers/users/notifications_controller.rb:2:3:5:5 | Users::NotificationsController |
|
| app/controllers/users/notifications_controller.rb:2:3:5:5 | Users::NotificationsController |
|
||||||
| filter_flow.rb:9:1:23:3 | OneController |
|
| filter_flow.rb:9:1:23:3 | OneController |
|
||||||
| filter_flow.rb:25:1:40:3 | TwoController |
|
| filter_flow.rb:25:1:40:3 | TwoController |
|
||||||
| filter_flow.rb:42:1:57:3 | ThreeController |
|
| filter_flow.rb:42:1:57:3 | ThreeController |
|
||||||
|
@ -15,23 +15,23 @@ actionControllerControllerClasses
|
||||||
| params_flow.rb:1:1:162:3 | MyController |
|
| params_flow.rb:1:1:162:3 | MyController |
|
||||||
| params_flow.rb:170:1:178:3 | Subclass |
|
| params_flow.rb:170:1:178:3 | Subclass |
|
||||||
actionControllerActionMethods
|
actionControllerActionMethods
|
||||||
| controllers/comments_controller.rb:17:3:51:5 | index |
|
| app/controllers/comments_controller.rb:17:3:51:5 | index |
|
||||||
| controllers/comments_controller.rb:53:3:54:5 | create |
|
| app/controllers/comments_controller.rb:53:3:54:5 | create |
|
||||||
| controllers/comments_controller.rb:56:3:62:5 | show |
|
| app/controllers/comments_controller.rb:56:3:62:5 | show |
|
||||||
| controllers/comments_controller.rb:64:3:66:5 | photo |
|
| app/controllers/comments_controller.rb:64:3:66:5 | photo |
|
||||||
| controllers/comments_controller.rb:68:3:70:5 | destroy |
|
| app/controllers/comments_controller.rb:68:3:70:5 | destroy |
|
||||||
| controllers/foo/bars_controller.rb:5:3:7:5 | index |
|
| app/controllers/foo/bars_controller.rb:5:3:7:5 | index |
|
||||||
| controllers/foo/bars_controller.rb:9:3:18:5 | show_debug |
|
| app/controllers/foo/bars_controller.rb:9:3:18:5 | show_debug |
|
||||||
| controllers/foo/bars_controller.rb:20:3:24:5 | show |
|
| app/controllers/foo/bars_controller.rb:20:3:24:5 | show |
|
||||||
| controllers/foo/bars_controller.rb:26:3:28:5 | go_back |
|
| app/controllers/foo/bars_controller.rb:26:3:28:5 | go_back |
|
||||||
| controllers/foo/bars_controller.rb:30:3:32:5 | go_back_2 |
|
| app/controllers/foo/bars_controller.rb:30:3:32:5 | go_back_2 |
|
||||||
| controllers/foo/bars_controller.rb:34:3:39:5 | show_2 |
|
| app/controllers/foo/bars_controller.rb:34:3:39:5 | show_2 |
|
||||||
| controllers/photos_controller.rb:3:3:6:5 | show |
|
| app/controllers/photos_controller.rb:3:3:6:5 | show |
|
||||||
| controllers/photos_controller.rb:8:3:9:5 | foo |
|
| app/controllers/photos_controller.rb:8:3:9:5 | foo |
|
||||||
| controllers/posts_controller.rb:12:3:15:5 | index |
|
| app/controllers/posts_controller.rb:12:3:15:5 | index |
|
||||||
| controllers/posts_controller.rb:17:3:18:5 | show |
|
| app/controllers/posts_controller.rb:17:3:18:5 | show |
|
||||||
| controllers/posts_controller.rb:20:3:21:5 | upvote |
|
| app/controllers/posts_controller.rb:20:3:21:5 | upvote |
|
||||||
| controllers/users/notifications_controller.rb:3:5:4:7 | mark_as_read |
|
| app/controllers/users/notifications_controller.rb:3:5:4:7 | mark_as_read |
|
||||||
| filter_flow.rb:13:3:15:5 | a |
|
| filter_flow.rb:13:3:15:5 | a |
|
||||||
| filter_flow.rb:17:3:18:5 | b |
|
| filter_flow.rb:17:3:18:5 | b |
|
||||||
| filter_flow.rb:20:3:22:5 | c |
|
| filter_flow.rb:20:3:22:5 | c |
|
||||||
|
@ -87,12 +87,12 @@ actionControllerActionMethods
|
||||||
| params_flow.rb:165:3:167:5 | m34 |
|
| params_flow.rb:165:3:167:5 | m34 |
|
||||||
| params_flow.rb:171:3:173:5 | m35 |
|
| params_flow.rb:171:3:173:5 | m35 |
|
||||||
paramsCalls
|
paramsCalls
|
||||||
| controllers/comments_controller.rb:80:36:80:41 | call to params |
|
| app/controllers/comments_controller.rb:80:36:80:41 | call to params |
|
||||||
| controllers/foo/bars_controller.rb:13:21:13:26 | call to params |
|
| app/controllers/foo/bars_controller.rb:13:21:13:26 | call to params |
|
||||||
| controllers/foo/bars_controller.rb:14:10:14:15 | call to params |
|
| app/controllers/foo/bars_controller.rb:14:10:14:15 | call to params |
|
||||||
| controllers/foo/bars_controller.rb:21:21:21:26 | call to params |
|
| app/controllers/foo/bars_controller.rb:21:21:21:26 | call to params |
|
||||||
| controllers/foo/bars_controller.rb:22:10:22:15 | call to params |
|
| app/controllers/foo/bars_controller.rb:22:10:22:15 | call to params |
|
||||||
| controllers/posts_controller.rb:26:23:26:28 | call to params |
|
| app/controllers/posts_controller.rb:26:23:26:28 | call to params |
|
||||||
| filter_flow.rb:14:12:14:17 | call to params |
|
| filter_flow.rb:14:12:14:17 | call to params |
|
||||||
| filter_flow.rb:30:12:30:17 | call to params |
|
| filter_flow.rb:30:12:30:17 | call to params |
|
||||||
| filter_flow.rb:47:12:47:17 | call to params |
|
| filter_flow.rb:47:12:47:17 | call to params |
|
||||||
|
@ -147,12 +147,12 @@ paramsCalls
|
||||||
| params_flow.rb:172:10:172:15 | call to params |
|
| params_flow.rb:172:10:172:15 | call to params |
|
||||||
| params_flow.rb:176:10:176:15 | call to params |
|
| params_flow.rb:176:10:176:15 | call to params |
|
||||||
paramsSources
|
paramsSources
|
||||||
| controllers/comments_controller.rb:80:36:80:41 | call to params |
|
| app/controllers/comments_controller.rb:80:36:80:41 | call to params |
|
||||||
| controllers/foo/bars_controller.rb:13:21:13:26 | call to params |
|
| app/controllers/foo/bars_controller.rb:13:21:13:26 | call to params |
|
||||||
| controllers/foo/bars_controller.rb:14:10:14:15 | call to params |
|
| app/controllers/foo/bars_controller.rb:14:10:14:15 | call to params |
|
||||||
| controllers/foo/bars_controller.rb:21:21:21:26 | call to params |
|
| app/controllers/foo/bars_controller.rb:21:21:21:26 | call to params |
|
||||||
| controllers/foo/bars_controller.rb:22:10:22:15 | call to params |
|
| app/controllers/foo/bars_controller.rb:22:10:22:15 | call to params |
|
||||||
| controllers/posts_controller.rb:26:23:26:28 | call to params |
|
| app/controllers/posts_controller.rb:26:23:26:28 | call to params |
|
||||||
| filter_flow.rb:14:12:14:17 | call to params |
|
| filter_flow.rb:14:12:14:17 | call to params |
|
||||||
| filter_flow.rb:30:12:30:17 | call to params |
|
| filter_flow.rb:30:12:30:17 | call to params |
|
||||||
| filter_flow.rb:47:12:47:17 | call to params |
|
| filter_flow.rb:47:12:47:17 | call to params |
|
||||||
|
@ -207,22 +207,22 @@ paramsSources
|
||||||
| params_flow.rb:172:10:172:15 | call to params |
|
| params_flow.rb:172:10:172:15 | call to params |
|
||||||
| params_flow.rb:176:10:176:15 | call to params |
|
| params_flow.rb:176:10:176:15 | call to params |
|
||||||
httpInputAccesses
|
httpInputAccesses
|
||||||
| controllers/application_controller.rb:11:53:11:64 | call to path | ActionDispatch::Request#path |
|
| app/controllers/application_controller.rb:11:53:11:64 | call to path | ActionDispatch::Request#path |
|
||||||
| controllers/comments_controller.rb:18:5:18:18 | call to params | ActionDispatch::Request#params |
|
| app/controllers/comments_controller.rb:18:5:18:18 | call to params | ActionDispatch::Request#params |
|
||||||
| controllers/comments_controller.rb:19:5:19:22 | call to parameters | ActionDispatch::Request#parameters |
|
| app/controllers/comments_controller.rb:19:5:19:22 | call to parameters | ActionDispatch::Request#parameters |
|
||||||
| controllers/comments_controller.rb:20:5:20:15 | call to GET | ActionDispatch::Request#GET |
|
| app/controllers/comments_controller.rb:20:5:20:15 | call to GET | ActionDispatch::Request#GET |
|
||||||
| controllers/comments_controller.rb:21:5:21:16 | call to POST | ActionDispatch::Request#POST |
|
| app/controllers/comments_controller.rb:21:5:21:16 | call to POST | ActionDispatch::Request#POST |
|
||||||
| controllers/comments_controller.rb:22:5:22:28 | call to query_parameters | ActionDispatch::Request#query_parameters |
|
| app/controllers/comments_controller.rb:22:5:22:28 | call to query_parameters | ActionDispatch::Request#query_parameters |
|
||||||
| controllers/comments_controller.rb:23:5:23:30 | call to request_parameters | ActionDispatch::Request#request_parameters |
|
| app/controllers/comments_controller.rb:23:5:23:30 | call to request_parameters | ActionDispatch::Request#request_parameters |
|
||||||
| controllers/comments_controller.rb:24:5:24:31 | call to filtered_parameters | ActionDispatch::Request#filtered_parameters |
|
| app/controllers/comments_controller.rb:24:5:24:31 | call to filtered_parameters | ActionDispatch::Request#filtered_parameters |
|
||||||
| controllers/comments_controller.rb:69:12:69:30 | call to body_stream | ActionDispatch::Request#body_stream |
|
| app/controllers/comments_controller.rb:69:12:69:30 | call to body_stream | ActionDispatch::Request#body_stream |
|
||||||
| controllers/comments_controller.rb:80:36:80:41 | call to params | ActionController::Metal#params |
|
| app/controllers/comments_controller.rb:80:36:80:41 | call to params | ActionController::Metal#params |
|
||||||
| controllers/foo/bars_controller.rb:10:27:10:33 | call to cookies | ActionController::Metal#cookies |
|
| app/controllers/foo/bars_controller.rb:10:27:10:33 | call to cookies | ActionController::Metal#cookies |
|
||||||
| controllers/foo/bars_controller.rb:13:21:13:26 | call to params | ActionController::Metal#params |
|
| app/controllers/foo/bars_controller.rb:13:21:13:26 | call to params | ActionController::Metal#params |
|
||||||
| controllers/foo/bars_controller.rb:14:10:14:15 | call to params | ActionController::Metal#params |
|
| app/controllers/foo/bars_controller.rb:14:10:14:15 | call to params | ActionController::Metal#params |
|
||||||
| controllers/foo/bars_controller.rb:21:21:21:26 | call to params | ActionController::Metal#params |
|
| app/controllers/foo/bars_controller.rb:21:21:21:26 | call to params | ActionController::Metal#params |
|
||||||
| controllers/foo/bars_controller.rb:22:10:22:15 | call to params | ActionController::Metal#params |
|
| app/controllers/foo/bars_controller.rb:22:10:22:15 | call to params | ActionController::Metal#params |
|
||||||
| controllers/posts_controller.rb:26:23:26:28 | call to params | ActionController::Metal#params |
|
| app/controllers/posts_controller.rb:26:23:26:28 | call to params | ActionController::Metal#params |
|
||||||
| filter_flow.rb:14:12:14:17 | call to params | ActionController::Metal#params |
|
| filter_flow.rb:14:12:14:17 | call to params | ActionController::Metal#params |
|
||||||
| filter_flow.rb:30:12:30:17 | call to params | ActionController::Metal#params |
|
| filter_flow.rb:30:12:30:17 | call to params | ActionController::Metal#params |
|
||||||
| filter_flow.rb:47:12:47:17 | call to params | ActionController::Metal#params |
|
| filter_flow.rb:47:12:47:17 | call to params | ActionController::Metal#params |
|
||||||
|
@ -317,54 +317,72 @@ httpInputAccesses
|
||||||
| params_flow.rb:172:10:172:15 | call to params | ActionController::Metal#params |
|
| params_flow.rb:172:10:172:15 | call to params | ActionController::Metal#params |
|
||||||
| params_flow.rb:176:10:176:15 | call to params | ActionController::Metal#params |
|
| params_flow.rb:176:10:176:15 | call to params | ActionController::Metal#params |
|
||||||
cookiesCalls
|
cookiesCalls
|
||||||
| controllers/foo/bars_controller.rb:10:27:10:33 | call to cookies |
|
| app/controllers/foo/bars_controller.rb:10:27:10:33 | call to cookies |
|
||||||
cookiesSources
|
cookiesSources
|
||||||
| controllers/foo/bars_controller.rb:10:27:10:33 | call to cookies |
|
| app/controllers/foo/bars_controller.rb:10:27:10:33 | call to cookies |
|
||||||
redirectToCalls
|
redirectToCalls
|
||||||
| controllers/comments_controller.rb:58:21:58:49 | call to redirect_to |
|
| app/controllers/comments_controller.rb:58:21:58:49 | call to redirect_to |
|
||||||
| controllers/foo/bars_controller.rb:17:5:17:30 | call to redirect_to |
|
| app/controllers/foo/bars_controller.rb:17:5:17:30 | call to redirect_to |
|
||||||
| controllers/foo/bars_controller.rb:27:5:27:39 | call to redirect_back_or_to |
|
| app/controllers/foo/bars_controller.rb:27:5:27:39 | call to redirect_back_or_to |
|
||||||
| controllers/foo/bars_controller.rb:31:5:31:56 | call to redirect_back |
|
| app/controllers/foo/bars_controller.rb:31:5:31:56 | call to redirect_back |
|
||||||
renderCalls
|
renderCalls
|
||||||
| controllers/comments_controller.rb:60:21:60:64 | call to render |
|
| app/controllers/comments_controller.rb:60:21:60:64 | call to render |
|
||||||
| controllers/comments_controller.rb:76:5:76:68 | call to render |
|
| app/controllers/comments_controller.rb:76:5:76:68 | call to render |
|
||||||
| controllers/foo/bars_controller.rb:6:5:6:37 | call to render |
|
| app/controllers/foo/bars_controller.rb:6:5:6:37 | call to render |
|
||||||
| controllers/foo/bars_controller.rb:23:5:23:76 | call to render |
|
| app/controllers/foo/bars_controller.rb:23:5:23:76 | call to render |
|
||||||
| controllers/foo/bars_controller.rb:35:5:35:33 | call to render |
|
| app/controllers/foo/bars_controller.rb:35:5:35:33 | call to render |
|
||||||
| controllers/foo/bars_controller.rb:38:5:38:50 | call to render |
|
| app/controllers/foo/bars_controller.rb:38:5:38:50 | call to render |
|
||||||
| controllers/foo/bars_controller.rb:44:5:44:17 | call to render |
|
| app/controllers/foo/bars_controller.rb:44:5:44:17 | call to render |
|
||||||
| controllers/posts_controller.rb:13:5:13:51 | call to render |
|
| app/controllers/posts_controller.rb:13:5:13:51 | call to render |
|
||||||
| controllers/posts_controller.rb:14:5:14:127 | call to render |
|
| app/controllers/posts_controller.rb:14:5:14:127 | call to render |
|
||||||
| controllers/posts_controller.rb:36:5:36:51 | call to render |
|
| app/controllers/posts_controller.rb:36:5:36:51 | call to render |
|
||||||
httpResponses
|
httpResponses
|
||||||
| controllers/comments_controller.rb:26:5:26:17 | call to body= | controllers/comments_controller.rb:26:21:26:34 | ... = ... |
|
| app/controllers/comments_controller.rb:26:5:26:17 | call to body= | app/controllers/comments_controller.rb:26:21:26:34 | ... = ... |
|
||||||
| controllers/comments_controller.rb:36:5:36:37 | call to send_file | controllers/comments_controller.rb:36:24:36:36 | "my-file.ext" |
|
| app/controllers/comments_controller.rb:36:5:36:37 | call to send_file | app/controllers/comments_controller.rb:36:24:36:36 | "my-file.ext" |
|
||||||
| controllers/comments_controller.rb:65:5:65:20 | call to send_data | controllers/comments_controller.rb:65:15:65:20 | @photo |
|
| app/controllers/comments_controller.rb:65:5:65:20 | call to send_data | app/controllers/comments_controller.rb:65:15:65:20 | @photo |
|
||||||
| controllers/foo/bars_controller.rb:15:16:15:97 | call to render_to_string | controllers/foo/bars_controller.rb:15:33:15:47 | "foo/bars/show" |
|
| app/controllers/foo/bars_controller.rb:15:16:15:97 | call to render_to_string | app/controllers/foo/bars_controller.rb:15:33:15:47 | "foo/bars/show" |
|
||||||
| controllers/foo/bars_controller.rb:23:5:23:76 | call to render | controllers/foo/bars_controller.rb:23:12:23:26 | "foo/bars/show" |
|
| app/controllers/foo/bars_controller.rb:23:5:23:76 | call to render | app/controllers/foo/bars_controller.rb:23:12:23:26 | "foo/bars/show" |
|
||||||
| controllers/foo/bars_controller.rb:35:5:35:33 | call to render | controllers/foo/bars_controller.rb:35:18:35:33 | call to [] |
|
| app/controllers/foo/bars_controller.rb:35:5:35:33 | call to render | app/controllers/foo/bars_controller.rb:35:18:35:33 | call to [] |
|
||||||
| controllers/foo/bars_controller.rb:36:12:36:67 | call to render_to_string | controllers/foo/bars_controller.rb:36:29:36:33 | @user |
|
| app/controllers/foo/bars_controller.rb:36:12:36:67 | call to render_to_string | app/controllers/foo/bars_controller.rb:36:29:36:33 | @user |
|
||||||
| controllers/foo/bars_controller.rb:38:5:38:50 | call to render | controllers/foo/bars_controller.rb:38:12:38:22 | call to backtrace |
|
| app/controllers/foo/bars_controller.rb:38:5:38:50 | call to render | app/controllers/foo/bars_controller.rb:38:12:38:22 | call to backtrace |
|
||||||
| controllers/foo/bars_controller.rb:44:5:44:17 | call to render | controllers/foo/bars_controller.rb:44:12:44:17 | "show" |
|
| app/controllers/foo/bars_controller.rb:44:5:44:17 | call to render | app/controllers/foo/bars_controller.rb:44:12:44:17 | "show" |
|
||||||
actionControllerHelperMethods
|
actionControllerHelperMethods
|
||||||
getAssociatedControllerClasses
|
getAssociatedControllerClasses
|
||||||
|
| app/controllers/comments_controller.rb:1:1:104:3 | CommentsController | app/views/comments/create.html.erb:0:0:0:0 | app/views/comments/create.html.erb |
|
||||||
|
| app/controllers/comments_controller.rb:1:1:104:3 | CommentsController | app/views/comments/destroy.html.erb:0:0:0:0 | app/views/comments/destroy.html.erb |
|
||||||
|
| app/controllers/comments_controller.rb:1:1:104:3 | CommentsController | app/views/comments/index.html.erb:0:0:0:0 | app/views/comments/index.html.erb |
|
||||||
|
| app/controllers/comments_controller.rb:1:1:104:3 | CommentsController | app/views/comments/show.html.erb:0:0:0:0 | app/views/comments/show.html.erb |
|
||||||
|
| app/controllers/photos_controller.rb:1:1:10:3 | PhotosController | app/views/photos/foo.html.erb:0:0:0:0 | app/views/photos/foo.html.erb |
|
||||||
|
| app/controllers/photos_controller.rb:1:1:10:3 | PhotosController | app/views/photos/show.html.erb:0:0:0:0 | app/views/photos/show.html.erb |
|
||||||
|
| app/controllers/posts_controller.rb:1:1:32:3 | PostsController | app/views/posts/index.html.erb:0:0:0:0 | app/views/posts/index.html.erb |
|
||||||
|
| app/controllers/posts_controller.rb:1:1:32:3 | PostsController | app/views/posts/show.html.erb:0:0:0:0 | app/views/posts/show.html.erb |
|
||||||
|
| app/controllers/posts_controller.rb:1:1:32:3 | PostsController | app/views/posts/upvote.html.erb:0:0:0:0 | app/views/posts/upvote.html.erb |
|
||||||
controllerTemplateFiles
|
controllerTemplateFiles
|
||||||
|
| app/controllers/comments_controller.rb:1:1:104:3 | CommentsController | app/views/comments/create.html.erb:0:0:0:0 | app/views/comments/create.html.erb |
|
||||||
|
| app/controllers/comments_controller.rb:1:1:104:3 | CommentsController | app/views/comments/destroy.html.erb:0:0:0:0 | app/views/comments/destroy.html.erb |
|
||||||
|
| app/controllers/comments_controller.rb:1:1:104:3 | CommentsController | app/views/comments/index.html.erb:0:0:0:0 | app/views/comments/index.html.erb |
|
||||||
|
| app/controllers/comments_controller.rb:1:1:104:3 | CommentsController | app/views/comments/show.html.erb:0:0:0:0 | app/views/comments/show.html.erb |
|
||||||
|
| app/controllers/photos_controller.rb:1:1:10:3 | PhotosController | app/views/photos/foo.html.erb:0:0:0:0 | app/views/photos/foo.html.erb |
|
||||||
|
| app/controllers/photos_controller.rb:1:1:10:3 | PhotosController | app/views/photos/show.html.erb:0:0:0:0 | app/views/photos/show.html.erb |
|
||||||
|
| app/controllers/posts_controller.rb:1:1:32:3 | PostsController | app/views/posts/index.html.erb:0:0:0:0 | app/views/posts/index.html.erb |
|
||||||
|
| app/controllers/posts_controller.rb:1:1:32:3 | PostsController | app/views/posts/show.html.erb:0:0:0:0 | app/views/posts/show.html.erb |
|
||||||
|
| app/controllers/posts_controller.rb:1:1:32:3 | PostsController | app/views/posts/upvote.html.erb:0:0:0:0 | app/views/posts/upvote.html.erb |
|
||||||
headerWriteAccesses
|
headerWriteAccesses
|
||||||
| controllers/comments_controller.rb:30:5:30:35 | call to []= | content-type | controllers/comments_controller.rb:30:39:30:49 | ... = ... |
|
| app/controllers/comments_controller.rb:30:5:30:35 | call to []= | content-type | app/controllers/comments_controller.rb:30:39:30:49 | ... = ... |
|
||||||
| controllers/comments_controller.rb:31:5:31:46 | call to set_header | content-length | controllers/comments_controller.rb:31:43:31:45 | 100 |
|
| app/controllers/comments_controller.rb:31:5:31:46 | call to set_header | content-length | app/controllers/comments_controller.rb:31:43:31:45 | 100 |
|
||||||
| controllers/comments_controller.rb:32:5:32:39 | call to []= | x-custom-header | controllers/comments_controller.rb:32:43:32:46 | ... = ... |
|
| app/controllers/comments_controller.rb:32:5:32:39 | call to []= | x-custom-header | app/controllers/comments_controller.rb:32:43:32:46 | ... = ... |
|
||||||
| controllers/comments_controller.rb:33:5:33:39 | call to []= | x-another-custom-header | controllers/comments_controller.rb:33:43:33:47 | ... = ... |
|
| app/controllers/comments_controller.rb:33:5:33:39 | call to []= | x-another-custom-header | app/controllers/comments_controller.rb:33:43:33:47 | ... = ... |
|
||||||
| controllers/comments_controller.rb:34:5:34:49 | call to add_header | x-yet-another | controllers/comments_controller.rb:34:42:34:49 | "indeed" |
|
| app/controllers/comments_controller.rb:34:5:34:49 | call to add_header | x-yet-another | app/controllers/comments_controller.rb:34:42:34:49 | "indeed" |
|
||||||
| controllers/comments_controller.rb:40:5:40:21 | call to location= | location | controllers/comments_controller.rb:40:25:40:36 | ... = ... |
|
| app/controllers/comments_controller.rb:40:5:40:21 | call to location= | location | app/controllers/comments_controller.rb:40:25:40:36 | ... = ... |
|
||||||
| controllers/comments_controller.rb:41:5:41:26 | call to cache_control= | cache-control | controllers/comments_controller.rb:41:30:41:36 | ... = ... |
|
| app/controllers/comments_controller.rb:41:5:41:26 | call to cache_control= | cache-control | app/controllers/comments_controller.rb:41:30:41:36 | ... = ... |
|
||||||
| controllers/comments_controller.rb:42:5:42:27 | call to _cache_control= | cache-control | controllers/comments_controller.rb:42:31:42:37 | ... = ... |
|
| app/controllers/comments_controller.rb:42:5:42:27 | call to _cache_control= | cache-control | app/controllers/comments_controller.rb:42:31:42:37 | ... = ... |
|
||||||
| controllers/comments_controller.rb:43:5:43:17 | call to etag= | etag | controllers/comments_controller.rb:43:21:43:27 | ... = ... |
|
| app/controllers/comments_controller.rb:43:5:43:17 | call to etag= | etag | app/controllers/comments_controller.rb:43:21:43:27 | ... = ... |
|
||||||
| controllers/comments_controller.rb:44:5:44:20 | call to charset= | content-type | controllers/comments_controller.rb:44:24:44:30 | ... = ... |
|
| app/controllers/comments_controller.rb:44:5:44:20 | call to charset= | content-type | app/controllers/comments_controller.rb:44:24:44:30 | ... = ... |
|
||||||
| controllers/comments_controller.rb:45:5:45:25 | call to content_type= | content-type | controllers/comments_controller.rb:45:29:45:35 | ... = ... |
|
| app/controllers/comments_controller.rb:45:5:45:25 | call to content_type= | content-type | app/controllers/comments_controller.rb:45:29:45:35 | ... = ... |
|
||||||
| controllers/comments_controller.rb:47:5:47:17 | call to date= | date | controllers/comments_controller.rb:47:21:47:30 | ... = ... |
|
| app/controllers/comments_controller.rb:47:5:47:17 | call to date= | date | app/controllers/comments_controller.rb:47:21:47:30 | ... = ... |
|
||||||
| controllers/comments_controller.rb:48:5:48:26 | call to last_modified= | last-modified | controllers/comments_controller.rb:48:30:48:43 | ... = ... |
|
| app/controllers/comments_controller.rb:48:5:48:26 | call to last_modified= | last-modified | app/controllers/comments_controller.rb:48:30:48:43 | ... = ... |
|
||||||
| controllers/comments_controller.rb:49:5:49:22 | call to weak_etag= | etag | controllers/comments_controller.rb:49:26:49:32 | ... = ... |
|
| app/controllers/comments_controller.rb:49:5:49:22 | call to weak_etag= | etag | app/controllers/comments_controller.rb:49:26:49:32 | ... = ... |
|
||||||
| controllers/comments_controller.rb:50:5:50:24 | call to strong_etag= | etag | controllers/comments_controller.rb:50:28:50:34 | ... = ... |
|
| app/controllers/comments_controller.rb:50:5:50:24 | call to strong_etag= | etag | app/controllers/comments_controller.rb:50:28:50:34 | ... = ... |
|
||||||
loggingCalls
|
loggingCalls
|
||||||
| logging.rb:3:9:3:31 | call to info | logging.rb:3:21:3:31 | "some info" |
|
| logging.rb:3:9:3:31 | call to info | logging.rb:3:21:3:31 | "some info" |
|
||||||
| logging.rb:4:9:4:31 | call to warn | logging.rb:4:21:4:31 | "a warning" |
|
| logging.rb:4:9:4:31 | call to warn | logging.rb:4:21:4:31 | "a warning" |
|
||||||
|
|
|
@ -1,95 +1,95 @@
|
||||||
additionalFlowSteps
|
additionalFlowSteps
|
||||||
| controllers/application_controller.rb:6:3:8:5 | self in set_user | controllers/comments_controller.rb:74:3:77:5 | self in ensure_user_can_edit_comments |
|
| app/controllers/application_controller.rb:6:3:8:5 | self in set_user | app/controllers/comments_controller.rb:74:3:77:5 | self in ensure_user_can_edit_comments |
|
||||||
| controllers/application_controller.rb:6:3:8:5 | self in set_user | controllers/comments_controller.rb:79:3:81:5 | self in set_comment |
|
| app/controllers/application_controller.rb:6:3:8:5 | self in set_user | app/controllers/comments_controller.rb:79:3:81:5 | self in set_comment |
|
||||||
| controllers/application_controller.rb:6:3:8:5 | self in set_user | controllers/comments_controller.rb:99:3:100:5 | self in foo |
|
| app/controllers/application_controller.rb:6:3:8:5 | self in set_user | app/controllers/comments_controller.rb:99:3:100:5 | self in foo |
|
||||||
| controllers/application_controller.rb:6:3:8:5 | self in set_user | controllers/posts_controller.rb:12:3:15:5 | self in index |
|
| app/controllers/application_controller.rb:6:3:8:5 | self in set_user | app/controllers/posts_controller.rb:12:3:15:5 | self in index |
|
||||||
| controllers/application_controller.rb:6:3:8:5 | self in set_user | controllers/posts_controller.rb:17:3:18:5 | self in show |
|
| app/controllers/application_controller.rb:6:3:8:5 | self in set_user | app/controllers/posts_controller.rb:17:3:18:5 | self in show |
|
||||||
| controllers/application_controller.rb:6:3:8:5 | self in set_user | controllers/posts_controller.rb:20:3:21:5 | self in upvote |
|
| app/controllers/application_controller.rb:6:3:8:5 | self in set_user | app/controllers/posts_controller.rb:20:3:21:5 | self in upvote |
|
||||||
| controllers/application_controller.rb:7:5:7:9 | [post] self | controllers/comments_controller.rb:74:3:77:5 | self in ensure_user_can_edit_comments |
|
| app/controllers/application_controller.rb:7:5:7:9 | [post] self | app/controllers/comments_controller.rb:74:3:77:5 | self in ensure_user_can_edit_comments |
|
||||||
| controllers/application_controller.rb:7:5:7:9 | [post] self | controllers/comments_controller.rb:79:3:81:5 | self in set_comment |
|
| app/controllers/application_controller.rb:7:5:7:9 | [post] self | app/controllers/comments_controller.rb:79:3:81:5 | self in set_comment |
|
||||||
| controllers/application_controller.rb:7:5:7:9 | [post] self | controllers/comments_controller.rb:99:3:100:5 | self in foo |
|
| app/controllers/application_controller.rb:7:5:7:9 | [post] self | app/controllers/comments_controller.rb:99:3:100:5 | self in foo |
|
||||||
| controllers/application_controller.rb:7:5:7:9 | [post] self | controllers/posts_controller.rb:12:3:15:5 | self in index |
|
| app/controllers/application_controller.rb:7:5:7:9 | [post] self | app/controllers/posts_controller.rb:12:3:15:5 | self in index |
|
||||||
| controllers/application_controller.rb:7:5:7:9 | [post] self | controllers/posts_controller.rb:17:3:18:5 | self in show |
|
| app/controllers/application_controller.rb:7:5:7:9 | [post] self | app/controllers/posts_controller.rb:17:3:18:5 | self in show |
|
||||||
| controllers/application_controller.rb:7:5:7:9 | [post] self | controllers/posts_controller.rb:20:3:21:5 | self in upvote |
|
| app/controllers/application_controller.rb:7:5:7:9 | [post] self | app/controllers/posts_controller.rb:20:3:21:5 | self in upvote |
|
||||||
| controllers/application_controller.rb:7:23:7:29 | [post] self | controllers/comments_controller.rb:74:3:77:5 | self in ensure_user_can_edit_comments |
|
| app/controllers/application_controller.rb:7:23:7:29 | [post] self | app/controllers/comments_controller.rb:74:3:77:5 | self in ensure_user_can_edit_comments |
|
||||||
| controllers/application_controller.rb:7:23:7:29 | [post] self | controllers/comments_controller.rb:79:3:81:5 | self in set_comment |
|
| app/controllers/application_controller.rb:7:23:7:29 | [post] self | app/controllers/comments_controller.rb:79:3:81:5 | self in set_comment |
|
||||||
| controllers/application_controller.rb:7:23:7:29 | [post] self | controllers/comments_controller.rb:99:3:100:5 | self in foo |
|
| app/controllers/application_controller.rb:7:23:7:29 | [post] self | app/controllers/comments_controller.rb:99:3:100:5 | self in foo |
|
||||||
| controllers/application_controller.rb:7:23:7:29 | [post] self | controllers/posts_controller.rb:12:3:15:5 | self in index |
|
| app/controllers/application_controller.rb:7:23:7:29 | [post] self | app/controllers/posts_controller.rb:12:3:15:5 | self in index |
|
||||||
| controllers/application_controller.rb:7:23:7:29 | [post] self | controllers/posts_controller.rb:17:3:18:5 | self in show |
|
| app/controllers/application_controller.rb:7:23:7:29 | [post] self | app/controllers/posts_controller.rb:17:3:18:5 | self in show |
|
||||||
| controllers/application_controller.rb:7:23:7:29 | [post] self | controllers/posts_controller.rb:20:3:21:5 | self in upvote |
|
| app/controllers/application_controller.rb:7:23:7:29 | [post] self | app/controllers/posts_controller.rb:20:3:21:5 | self in upvote |
|
||||||
| controllers/application_controller.rb:10:3:12:5 | self in log_request | controllers/application_controller.rb:6:3:8:5 | self in set_user |
|
| app/controllers/application_controller.rb:10:3:12:5 | self in log_request | app/controllers/application_controller.rb:6:3:8:5 | self in set_user |
|
||||||
| controllers/application_controller.rb:10:3:12:5 | self in log_request | controllers/photos_controller.rb:3:3:6:5 | self in show |
|
| app/controllers/application_controller.rb:10:3:12:5 | self in log_request | app/controllers/photos_controller.rb:3:3:6:5 | self in show |
|
||||||
| controllers/application_controller.rb:10:3:12:5 | self in log_request | controllers/posts_controller.rb:25:3:27:5 | self in set_post |
|
| app/controllers/application_controller.rb:10:3:12:5 | self in log_request | app/controllers/posts_controller.rb:25:3:27:5 | self in set_post |
|
||||||
| controllers/application_controller.rb:11:35:11:41 | [post] self | controllers/application_controller.rb:6:3:8:5 | self in set_user |
|
| app/controllers/application_controller.rb:11:35:11:41 | [post] self | app/controllers/application_controller.rb:6:3:8:5 | self in set_user |
|
||||||
| controllers/application_controller.rb:11:35:11:41 | [post] self | controllers/photos_controller.rb:3:3:6:5 | self in show |
|
| app/controllers/application_controller.rb:11:35:11:41 | [post] self | app/controllers/photos_controller.rb:3:3:6:5 | self in show |
|
||||||
| controllers/application_controller.rb:11:35:11:41 | [post] self | controllers/posts_controller.rb:25:3:27:5 | self in set_post |
|
| app/controllers/application_controller.rb:11:35:11:41 | [post] self | app/controllers/posts_controller.rb:25:3:27:5 | self in set_post |
|
||||||
| controllers/application_controller.rb:11:53:11:59 | [post] self | controllers/application_controller.rb:6:3:8:5 | self in set_user |
|
| app/controllers/application_controller.rb:11:53:11:59 | [post] self | app/controllers/application_controller.rb:6:3:8:5 | self in set_user |
|
||||||
| controllers/application_controller.rb:11:53:11:59 | [post] self | controllers/photos_controller.rb:3:3:6:5 | self in show |
|
| app/controllers/application_controller.rb:11:53:11:59 | [post] self | app/controllers/photos_controller.rb:3:3:6:5 | self in show |
|
||||||
| controllers/application_controller.rb:11:53:11:59 | [post] self | controllers/posts_controller.rb:25:3:27:5 | self in set_post |
|
| app/controllers/application_controller.rb:11:53:11:59 | [post] self | app/controllers/posts_controller.rb:25:3:27:5 | self in set_post |
|
||||||
| controllers/comments_controller.rb:17:3:51:5 | self in index | controllers/comments_controller.rb:87:3:89:5 | self in check_feature_flags |
|
| app/controllers/comments_controller.rb:17:3:51:5 | self in index | app/controllers/comments_controller.rb:87:3:89:5 | self in check_feature_flags |
|
||||||
| controllers/comments_controller.rb:18:5:18:11 | [post] self | controllers/comments_controller.rb:87:3:89:5 | self in check_feature_flags |
|
| app/controllers/comments_controller.rb:18:5:18:11 | [post] self | app/controllers/comments_controller.rb:87:3:89:5 | self in check_feature_flags |
|
||||||
| controllers/comments_controller.rb:19:5:19:11 | [post] self | controllers/comments_controller.rb:87:3:89:5 | self in check_feature_flags |
|
| app/controllers/comments_controller.rb:19:5:19:11 | [post] self | app/controllers/comments_controller.rb:87:3:89:5 | self in check_feature_flags |
|
||||||
| controllers/comments_controller.rb:20:5:20:11 | [post] self | controllers/comments_controller.rb:87:3:89:5 | self in check_feature_flags |
|
| app/controllers/comments_controller.rb:20:5:20:11 | [post] self | app/controllers/comments_controller.rb:87:3:89:5 | self in check_feature_flags |
|
||||||
| controllers/comments_controller.rb:21:5:21:11 | [post] self | controllers/comments_controller.rb:87:3:89:5 | self in check_feature_flags |
|
| app/controllers/comments_controller.rb:21:5:21:11 | [post] self | app/controllers/comments_controller.rb:87:3:89:5 | self in check_feature_flags |
|
||||||
| controllers/comments_controller.rb:22:5:22:11 | [post] self | controllers/comments_controller.rb:87:3:89:5 | self in check_feature_flags |
|
| app/controllers/comments_controller.rb:22:5:22:11 | [post] self | app/controllers/comments_controller.rb:87:3:89:5 | self in check_feature_flags |
|
||||||
| controllers/comments_controller.rb:23:5:23:11 | [post] self | controllers/comments_controller.rb:87:3:89:5 | self in check_feature_flags |
|
| app/controllers/comments_controller.rb:23:5:23:11 | [post] self | app/controllers/comments_controller.rb:87:3:89:5 | self in check_feature_flags |
|
||||||
| controllers/comments_controller.rb:24:5:24:11 | [post] self | controllers/comments_controller.rb:87:3:89:5 | self in check_feature_flags |
|
| app/controllers/comments_controller.rb:24:5:24:11 | [post] self | app/controllers/comments_controller.rb:87:3:89:5 | self in check_feature_flags |
|
||||||
| controllers/comments_controller.rb:26:5:26:12 | [post] self | controllers/comments_controller.rb:87:3:89:5 | self in check_feature_flags |
|
| app/controllers/comments_controller.rb:26:5:26:12 | [post] self | app/controllers/comments_controller.rb:87:3:89:5 | self in check_feature_flags |
|
||||||
| controllers/comments_controller.rb:28:5:28:12 | [post] self | controllers/comments_controller.rb:87:3:89:5 | self in check_feature_flags |
|
| app/controllers/comments_controller.rb:28:5:28:12 | [post] self | app/controllers/comments_controller.rb:87:3:89:5 | self in check_feature_flags |
|
||||||
| controllers/comments_controller.rb:30:5:30:12 | [post] self | controllers/comments_controller.rb:87:3:89:5 | self in check_feature_flags |
|
| app/controllers/comments_controller.rb:30:5:30:12 | [post] self | app/controllers/comments_controller.rb:87:3:89:5 | self in check_feature_flags |
|
||||||
| controllers/comments_controller.rb:31:5:31:12 | [post] self | controllers/comments_controller.rb:87:3:89:5 | self in check_feature_flags |
|
| app/controllers/comments_controller.rb:31:5:31:12 | [post] self | app/controllers/comments_controller.rb:87:3:89:5 | self in check_feature_flags |
|
||||||
| controllers/comments_controller.rb:32:5:32:12 | [post] self | controllers/comments_controller.rb:87:3:89:5 | self in check_feature_flags |
|
| app/controllers/comments_controller.rb:32:5:32:12 | [post] self | app/controllers/comments_controller.rb:87:3:89:5 | self in check_feature_flags |
|
||||||
| controllers/comments_controller.rb:33:5:33:12 | [post] self | controllers/comments_controller.rb:87:3:89:5 | self in check_feature_flags |
|
| app/controllers/comments_controller.rb:33:5:33:12 | [post] self | app/controllers/comments_controller.rb:87:3:89:5 | self in check_feature_flags |
|
||||||
| controllers/comments_controller.rb:34:5:34:12 | [post] self | controllers/comments_controller.rb:87:3:89:5 | self in check_feature_flags |
|
| app/controllers/comments_controller.rb:34:5:34:12 | [post] self | app/controllers/comments_controller.rb:87:3:89:5 | self in check_feature_flags |
|
||||||
| controllers/comments_controller.rb:36:5:36:12 | [post] self | controllers/comments_controller.rb:87:3:89:5 | self in check_feature_flags |
|
| app/controllers/comments_controller.rb:36:5:36:12 | [post] self | app/controllers/comments_controller.rb:87:3:89:5 | self in check_feature_flags |
|
||||||
| controllers/comments_controller.rb:38:5:38:12 | [post] self | controllers/comments_controller.rb:87:3:89:5 | self in check_feature_flags |
|
| app/controllers/comments_controller.rb:38:5:38:12 | [post] self | app/controllers/comments_controller.rb:87:3:89:5 | self in check_feature_flags |
|
||||||
| controllers/comments_controller.rb:40:5:40:12 | [post] self | controllers/comments_controller.rb:87:3:89:5 | self in check_feature_flags |
|
| app/controllers/comments_controller.rb:40:5:40:12 | [post] self | app/controllers/comments_controller.rb:87:3:89:5 | self in check_feature_flags |
|
||||||
| controllers/comments_controller.rb:41:5:41:12 | [post] self | controllers/comments_controller.rb:87:3:89:5 | self in check_feature_flags |
|
| app/controllers/comments_controller.rb:41:5:41:12 | [post] self | app/controllers/comments_controller.rb:87:3:89:5 | self in check_feature_flags |
|
||||||
| controllers/comments_controller.rb:42:5:42:12 | [post] self | controllers/comments_controller.rb:87:3:89:5 | self in check_feature_flags |
|
| app/controllers/comments_controller.rb:42:5:42:12 | [post] self | app/controllers/comments_controller.rb:87:3:89:5 | self in check_feature_flags |
|
||||||
| controllers/comments_controller.rb:43:5:43:12 | [post] self | controllers/comments_controller.rb:87:3:89:5 | self in check_feature_flags |
|
| app/controllers/comments_controller.rb:43:5:43:12 | [post] self | app/controllers/comments_controller.rb:87:3:89:5 | self in check_feature_flags |
|
||||||
| controllers/comments_controller.rb:44:5:44:12 | [post] self | controllers/comments_controller.rb:87:3:89:5 | self in check_feature_flags |
|
| app/controllers/comments_controller.rb:44:5:44:12 | [post] self | app/controllers/comments_controller.rb:87:3:89:5 | self in check_feature_flags |
|
||||||
| controllers/comments_controller.rb:45:5:45:12 | [post] self | controllers/comments_controller.rb:87:3:89:5 | self in check_feature_flags |
|
| app/controllers/comments_controller.rb:45:5:45:12 | [post] self | app/controllers/comments_controller.rb:87:3:89:5 | self in check_feature_flags |
|
||||||
| controllers/comments_controller.rb:47:5:47:12 | [post] self | controllers/comments_controller.rb:87:3:89:5 | self in check_feature_flags |
|
| app/controllers/comments_controller.rb:47:5:47:12 | [post] self | app/controllers/comments_controller.rb:87:3:89:5 | self in check_feature_flags |
|
||||||
| controllers/comments_controller.rb:48:5:48:12 | [post] self | controllers/comments_controller.rb:87:3:89:5 | self in check_feature_flags |
|
| app/controllers/comments_controller.rb:48:5:48:12 | [post] self | app/controllers/comments_controller.rb:87:3:89:5 | self in check_feature_flags |
|
||||||
| controllers/comments_controller.rb:49:5:49:12 | [post] self | controllers/comments_controller.rb:87:3:89:5 | self in check_feature_flags |
|
| app/controllers/comments_controller.rb:49:5:49:12 | [post] self | app/controllers/comments_controller.rb:87:3:89:5 | self in check_feature_flags |
|
||||||
| controllers/comments_controller.rb:50:5:50:12 | [post] self | controllers/comments_controller.rb:87:3:89:5 | self in check_feature_flags |
|
| app/controllers/comments_controller.rb:50:5:50:12 | [post] self | app/controllers/comments_controller.rb:87:3:89:5 | self in check_feature_flags |
|
||||||
| controllers/comments_controller.rb:53:3:54:5 | self in create | controllers/comments_controller.rb:83:3:85:5 | self in log_comment_change |
|
| app/controllers/comments_controller.rb:53:3:54:5 | self in create | app/controllers/comments_controller.rb:83:3:85:5 | self in log_comment_change |
|
||||||
| controllers/comments_controller.rb:56:3:62:5 | self in show | controllers/comments_controller.rb:87:3:89:5 | self in check_feature_flags |
|
| app/controllers/comments_controller.rb:56:3:62:5 | self in show | app/controllers/comments_controller.rb:87:3:89:5 | self in check_feature_flags |
|
||||||
| controllers/comments_controller.rb:57:5:61:7 | [post] self | controllers/comments_controller.rb:87:3:89:5 | self in check_feature_flags |
|
| app/controllers/comments_controller.rb:57:5:61:7 | [post] self | app/controllers/comments_controller.rb:87:3:89:5 | self in check_feature_flags |
|
||||||
| controllers/comments_controller.rb:64:3:66:5 | self in photo | controllers/comments_controller.rb:83:3:85:5 | self in log_comment_change |
|
| app/controllers/comments_controller.rb:64:3:66:5 | self in photo | app/controllers/comments_controller.rb:83:3:85:5 | self in log_comment_change |
|
||||||
| controllers/comments_controller.rb:65:5:65:20 | [post] self | controllers/comments_controller.rb:83:3:85:5 | self in log_comment_change |
|
| app/controllers/comments_controller.rb:65:5:65:20 | [post] self | app/controllers/comments_controller.rb:83:3:85:5 | self in log_comment_change |
|
||||||
| controllers/comments_controller.rb:65:15:65:20 | [post] self | controllers/comments_controller.rb:83:3:85:5 | self in log_comment_change |
|
| app/controllers/comments_controller.rb:65:15:65:20 | [post] self | app/controllers/comments_controller.rb:83:3:85:5 | self in log_comment_change |
|
||||||
| controllers/comments_controller.rb:68:3:70:5 | self in destroy | controllers/comments_controller.rb:83:3:85:5 | self in log_comment_change |
|
| app/controllers/comments_controller.rb:68:3:70:5 | self in destroy | app/controllers/comments_controller.rb:83:3:85:5 | self in log_comment_change |
|
||||||
| controllers/comments_controller.rb:69:12:69:18 | [post] self | controllers/comments_controller.rb:83:3:85:5 | self in log_comment_change |
|
| app/controllers/comments_controller.rb:69:12:69:18 | [post] self | app/controllers/comments_controller.rb:83:3:85:5 | self in log_comment_change |
|
||||||
| controllers/comments_controller.rb:74:3:77:5 | self in ensure_user_can_edit_comments | controllers/comments_controller.rb:79:3:81:5 | self in set_comment |
|
| app/controllers/comments_controller.rb:74:3:77:5 | self in ensure_user_can_edit_comments | app/controllers/comments_controller.rb:79:3:81:5 | self in set_comment |
|
||||||
| controllers/comments_controller.rb:74:3:77:5 | self in ensure_user_can_edit_comments | controllers/comments_controller.rb:99:3:100:5 | self in foo |
|
| app/controllers/comments_controller.rb:74:3:77:5 | self in ensure_user_can_edit_comments | app/controllers/comments_controller.rb:99:3:100:5 | self in foo |
|
||||||
| controllers/comments_controller.rb:75:15:75:19 | [post] self | controllers/comments_controller.rb:79:3:81:5 | self in set_comment |
|
| app/controllers/comments_controller.rb:75:15:75:19 | [post] self | app/controllers/comments_controller.rb:79:3:81:5 | self in set_comment |
|
||||||
| controllers/comments_controller.rb:75:15:75:19 | [post] self | controllers/comments_controller.rb:99:3:100:5 | self in foo |
|
| app/controllers/comments_controller.rb:75:15:75:19 | [post] self | app/controllers/comments_controller.rb:99:3:100:5 | self in foo |
|
||||||
| controllers/comments_controller.rb:76:5:76:68 | [post] self | controllers/comments_controller.rb:79:3:81:5 | self in set_comment |
|
| app/controllers/comments_controller.rb:76:5:76:68 | [post] self | app/controllers/comments_controller.rb:79:3:81:5 | self in set_comment |
|
||||||
| controllers/comments_controller.rb:76:5:76:68 | [post] self | controllers/comments_controller.rb:99:3:100:5 | self in foo |
|
| app/controllers/comments_controller.rb:76:5:76:68 | [post] self | app/controllers/comments_controller.rb:99:3:100:5 | self in foo |
|
||||||
| controllers/comments_controller.rb:79:3:81:5 | self in set_comment | controllers/comments_controller.rb:99:3:100:5 | self in foo |
|
| app/controllers/comments_controller.rb:79:3:81:5 | self in set_comment | app/controllers/comments_controller.rb:99:3:100:5 | self in foo |
|
||||||
| controllers/comments_controller.rb:80:5:80:12 | [post] self | controllers/comments_controller.rb:99:3:100:5 | self in foo |
|
| app/controllers/comments_controller.rb:80:5:80:12 | [post] self | app/controllers/comments_controller.rb:99:3:100:5 | self in foo |
|
||||||
| controllers/comments_controller.rb:80:16:80:20 | [post] self | controllers/comments_controller.rb:99:3:100:5 | self in foo |
|
| app/controllers/comments_controller.rb:80:16:80:20 | [post] self | app/controllers/comments_controller.rb:99:3:100:5 | self in foo |
|
||||||
| controllers/comments_controller.rb:80:36:80:41 | [post] self | controllers/comments_controller.rb:99:3:100:5 | self in foo |
|
| app/controllers/comments_controller.rb:80:36:80:41 | [post] self | app/controllers/comments_controller.rb:99:3:100:5 | self in foo |
|
||||||
| controllers/comments_controller.rb:83:3:85:5 | self in log_comment_change | controllers/comments_controller.rb:87:3:89:5 | self in check_feature_flags |
|
| app/controllers/comments_controller.rb:83:3:85:5 | self in log_comment_change | app/controllers/comments_controller.rb:87:3:89:5 | self in check_feature_flags |
|
||||||
| controllers/comments_controller.rb:84:45:84:49 | [post] self | controllers/comments_controller.rb:87:3:89:5 | self in check_feature_flags |
|
| app/controllers/comments_controller.rb:84:45:84:49 | [post] self | app/controllers/comments_controller.rb:87:3:89:5 | self in check_feature_flags |
|
||||||
| controllers/comments_controller.rb:84:61:84:68 | [post] self | controllers/comments_controller.rb:87:3:89:5 | self in check_feature_flags |
|
| app/controllers/comments_controller.rb:84:61:84:68 | [post] self | app/controllers/comments_controller.rb:87:3:89:5 | self in check_feature_flags |
|
||||||
| controllers/comments_controller.rb:87:3:89:5 | self in check_feature_flags | controllers/comments_controller.rb:95:3:97:5 | self in this_must_run_last |
|
| app/controllers/comments_controller.rb:87:3:89:5 | self in check_feature_flags | app/controllers/comments_controller.rb:95:3:97:5 | self in this_must_run_last |
|
||||||
| controllers/comments_controller.rb:88:5:88:28 | [post] self | controllers/comments_controller.rb:95:3:97:5 | self in this_must_run_last |
|
| app/controllers/comments_controller.rb:88:5:88:28 | [post] self | app/controllers/comments_controller.rb:95:3:97:5 | self in this_must_run_last |
|
||||||
| controllers/comments_controller.rb:91:3:93:5 | self in this_must_run_first | controllers/application_controller.rb:10:3:12:5 | self in log_request |
|
| app/controllers/comments_controller.rb:91:3:93:5 | self in this_must_run_first | app/controllers/application_controller.rb:10:3:12:5 | self in log_request |
|
||||||
| controllers/comments_controller.rb:99:3:100:5 | self in foo | controllers/comments_controller.rb:102:3:103:5 | self in bar |
|
| app/controllers/comments_controller.rb:99:3:100:5 | self in foo | app/controllers/comments_controller.rb:102:3:103:5 | self in bar |
|
||||||
| controllers/comments_controller.rb:102:3:103:5 | self in bar | controllers/comments_controller.rb:17:3:51:5 | self in index |
|
| app/controllers/comments_controller.rb:102:3:103:5 | self in bar | app/controllers/comments_controller.rb:17:3:51:5 | self in index |
|
||||||
| controllers/comments_controller.rb:102:3:103:5 | self in bar | controllers/comments_controller.rb:53:3:54:5 | self in create |
|
| app/controllers/comments_controller.rb:102:3:103:5 | self in bar | app/controllers/comments_controller.rb:53:3:54:5 | self in create |
|
||||||
| controllers/comments_controller.rb:102:3:103:5 | self in bar | controllers/comments_controller.rb:56:3:62:5 | self in show |
|
| app/controllers/comments_controller.rb:102:3:103:5 | self in bar | app/controllers/comments_controller.rb:56:3:62:5 | self in show |
|
||||||
| controllers/comments_controller.rb:102:3:103:5 | self in bar | controllers/comments_controller.rb:64:3:66:5 | self in photo |
|
| app/controllers/comments_controller.rb:102:3:103:5 | self in bar | app/controllers/comments_controller.rb:64:3:66:5 | self in photo |
|
||||||
| controllers/comments_controller.rb:102:3:103:5 | self in bar | controllers/comments_controller.rb:68:3:70:5 | self in destroy |
|
| app/controllers/comments_controller.rb:102:3:103:5 | self in bar | app/controllers/comments_controller.rb:68:3:70:5 | self in destroy |
|
||||||
| controllers/photos_controller.rb:3:3:6:5 | self in show | controllers/photos_controller.rb:8:3:9:5 | self in foo |
|
| app/controllers/photos_controller.rb:3:3:6:5 | self in show | app/controllers/photos_controller.rb:8:3:9:5 | self in foo |
|
||||||
| controllers/photos_controller.rb:4:5:4:6 | [post] self | controllers/photos_controller.rb:8:3:9:5 | self in foo |
|
| app/controllers/photos_controller.rb:4:5:4:6 | [post] self | app/controllers/photos_controller.rb:8:3:9:5 | self in foo |
|
||||||
| controllers/photos_controller.rb:5:5:5:6 | [post] self | controllers/photos_controller.rb:8:3:9:5 | self in foo |
|
| app/controllers/photos_controller.rb:5:5:5:6 | [post] self | app/controllers/photos_controller.rb:8:3:9:5 | self in foo |
|
||||||
| controllers/posts_controller.rb:20:3:21:5 | self in upvote | controllers/posts_controller.rb:29:3:31:5 | self in log_upvote |
|
| app/controllers/posts_controller.rb:20:3:21:5 | self in upvote | app/controllers/posts_controller.rb:29:3:31:5 | self in log_upvote |
|
||||||
| controllers/posts_controller.rb:25:3:27:5 | self in set_post | controllers/application_controller.rb:6:3:8:5 | self in set_user |
|
| app/controllers/posts_controller.rb:25:3:27:5 | self in set_post | app/controllers/application_controller.rb:6:3:8:5 | self in set_user |
|
||||||
| controllers/posts_controller.rb:26:5:26:9 | [post] self | controllers/application_controller.rb:6:3:8:5 | self in set_user |
|
| app/controllers/posts_controller.rb:26:5:26:9 | [post] self | app/controllers/application_controller.rb:6:3:8:5 | self in set_user |
|
||||||
| controllers/posts_controller.rb:26:23:26:28 | [post] self | controllers/application_controller.rb:6:3:8:5 | self in set_user |
|
| app/controllers/posts_controller.rb:26:23:26:28 | [post] self | app/controllers/application_controller.rb:6:3:8:5 | self in set_user |
|
||||||
| filter_flow.rb:13:3:15:5 | self in a | filter_flow.rb:17:3:18:5 | self in b |
|
| filter_flow.rb:13:3:15:5 | self in a | filter_flow.rb:17:3:18:5 | self in b |
|
||||||
| filter_flow.rb:14:5:14:8 | [post] self | filter_flow.rb:17:3:18:5 | self in b |
|
| filter_flow.rb:14:5:14:8 | [post] self | filter_flow.rb:17:3:18:5 | self in b |
|
||||||
| filter_flow.rb:14:12:14:17 | [post] self | filter_flow.rb:17:3:18:5 | self in b |
|
| filter_flow.rb:14:12:14:17 | [post] self | filter_flow.rb:17:3:18:5 | self in b |
|
||||||
|
@ -112,59 +112,59 @@ additionalFlowSteps
|
||||||
| filter_flow.rb:80:5:80:8 | [post] self | filter_flow.rb:83:3:84:5 | self in b |
|
| filter_flow.rb:80:5:80:8 | [post] self | filter_flow.rb:83:3:84:5 | self in b |
|
||||||
| filter_flow.rb:83:3:84:5 | self in b | filter_flow.rb:86:3:88:5 | self in c |
|
| filter_flow.rb:83:3:84:5 | self in b | filter_flow.rb:86:3:88:5 | self in c |
|
||||||
filterChain
|
filterChain
|
||||||
| controllers/comments_controller.rb:17:3:51:5 | index | controllers/application_controller.rb:6:3:8:5 | set_user | controllers/comments_controller.rb:99:3:100:5 | foo |
|
| app/controllers/comments_controller.rb:17:3:51:5 | index | app/controllers/application_controller.rb:6:3:8:5 | set_user | app/controllers/comments_controller.rb:99:3:100:5 | foo |
|
||||||
| controllers/comments_controller.rb:17:3:51:5 | index | controllers/application_controller.rb:10:3:12:5 | log_request | controllers/application_controller.rb:6:3:8:5 | set_user |
|
| app/controllers/comments_controller.rb:17:3:51:5 | index | app/controllers/application_controller.rb:10:3:12:5 | log_request | app/controllers/application_controller.rb:6:3:8:5 | set_user |
|
||||||
| controllers/comments_controller.rb:17:3:51:5 | index | controllers/comments_controller.rb:17:3:51:5 | index | controllers/comments_controller.rb:87:3:89:5 | check_feature_flags |
|
| app/controllers/comments_controller.rb:17:3:51:5 | index | app/controllers/comments_controller.rb:17:3:51:5 | index | app/controllers/comments_controller.rb:87:3:89:5 | check_feature_flags |
|
||||||
| controllers/comments_controller.rb:17:3:51:5 | index | controllers/comments_controller.rb:87:3:89:5 | check_feature_flags | controllers/comments_controller.rb:95:3:97:5 | this_must_run_last |
|
| app/controllers/comments_controller.rb:17:3:51:5 | index | app/controllers/comments_controller.rb:87:3:89:5 | check_feature_flags | app/controllers/comments_controller.rb:95:3:97:5 | this_must_run_last |
|
||||||
| controllers/comments_controller.rb:17:3:51:5 | index | controllers/comments_controller.rb:91:3:93:5 | this_must_run_first | controllers/application_controller.rb:10:3:12:5 | log_request |
|
| app/controllers/comments_controller.rb:17:3:51:5 | index | app/controllers/comments_controller.rb:91:3:93:5 | this_must_run_first | app/controllers/application_controller.rb:10:3:12:5 | log_request |
|
||||||
| controllers/comments_controller.rb:17:3:51:5 | index | controllers/comments_controller.rb:99:3:100:5 | foo | controllers/comments_controller.rb:102:3:103:5 | bar |
|
| app/controllers/comments_controller.rb:17:3:51:5 | index | app/controllers/comments_controller.rb:99:3:100:5 | foo | app/controllers/comments_controller.rb:102:3:103:5 | bar |
|
||||||
| controllers/comments_controller.rb:17:3:51:5 | index | controllers/comments_controller.rb:102:3:103:5 | bar | controllers/comments_controller.rb:17:3:51:5 | index |
|
| app/controllers/comments_controller.rb:17:3:51:5 | index | app/controllers/comments_controller.rb:102:3:103:5 | bar | app/controllers/comments_controller.rb:17:3:51:5 | index |
|
||||||
| controllers/comments_controller.rb:53:3:54:5 | create | controllers/application_controller.rb:6:3:8:5 | set_user | controllers/comments_controller.rb:74:3:77:5 | ensure_user_can_edit_comments |
|
| app/controllers/comments_controller.rb:53:3:54:5 | create | app/controllers/application_controller.rb:6:3:8:5 | set_user | app/controllers/comments_controller.rb:74:3:77:5 | ensure_user_can_edit_comments |
|
||||||
| controllers/comments_controller.rb:53:3:54:5 | create | controllers/application_controller.rb:10:3:12:5 | log_request | controllers/application_controller.rb:6:3:8:5 | set_user |
|
| app/controllers/comments_controller.rb:53:3:54:5 | create | app/controllers/application_controller.rb:10:3:12:5 | log_request | app/controllers/application_controller.rb:6:3:8:5 | set_user |
|
||||||
| controllers/comments_controller.rb:53:3:54:5 | create | controllers/comments_controller.rb:53:3:54:5 | create | controllers/comments_controller.rb:83:3:85:5 | log_comment_change |
|
| app/controllers/comments_controller.rb:53:3:54:5 | create | app/controllers/comments_controller.rb:53:3:54:5 | create | app/controllers/comments_controller.rb:83:3:85:5 | log_comment_change |
|
||||||
| controllers/comments_controller.rb:53:3:54:5 | create | controllers/comments_controller.rb:74:3:77:5 | ensure_user_can_edit_comments | controllers/comments_controller.rb:99:3:100:5 | foo |
|
| app/controllers/comments_controller.rb:53:3:54:5 | create | app/controllers/comments_controller.rb:74:3:77:5 | ensure_user_can_edit_comments | app/controllers/comments_controller.rb:99:3:100:5 | foo |
|
||||||
| controllers/comments_controller.rb:53:3:54:5 | create | controllers/comments_controller.rb:83:3:85:5 | log_comment_change | controllers/comments_controller.rb:87:3:89:5 | check_feature_flags |
|
| app/controllers/comments_controller.rb:53:3:54:5 | create | app/controllers/comments_controller.rb:83:3:85:5 | log_comment_change | app/controllers/comments_controller.rb:87:3:89:5 | check_feature_flags |
|
||||||
| controllers/comments_controller.rb:53:3:54:5 | create | controllers/comments_controller.rb:87:3:89:5 | check_feature_flags | controllers/comments_controller.rb:95:3:97:5 | this_must_run_last |
|
| app/controllers/comments_controller.rb:53:3:54:5 | create | app/controllers/comments_controller.rb:87:3:89:5 | check_feature_flags | app/controllers/comments_controller.rb:95:3:97:5 | this_must_run_last |
|
||||||
| controllers/comments_controller.rb:53:3:54:5 | create | controllers/comments_controller.rb:91:3:93:5 | this_must_run_first | controllers/application_controller.rb:10:3:12:5 | log_request |
|
| app/controllers/comments_controller.rb:53:3:54:5 | create | app/controllers/comments_controller.rb:91:3:93:5 | this_must_run_first | app/controllers/application_controller.rb:10:3:12:5 | log_request |
|
||||||
| controllers/comments_controller.rb:53:3:54:5 | create | controllers/comments_controller.rb:99:3:100:5 | foo | controllers/comments_controller.rb:102:3:103:5 | bar |
|
| app/controllers/comments_controller.rb:53:3:54:5 | create | app/controllers/comments_controller.rb:99:3:100:5 | foo | app/controllers/comments_controller.rb:102:3:103:5 | bar |
|
||||||
| controllers/comments_controller.rb:53:3:54:5 | create | controllers/comments_controller.rb:102:3:103:5 | bar | controllers/comments_controller.rb:53:3:54:5 | create |
|
| app/controllers/comments_controller.rb:53:3:54:5 | create | app/controllers/comments_controller.rb:102:3:103:5 | bar | app/controllers/comments_controller.rb:53:3:54:5 | create |
|
||||||
| controllers/comments_controller.rb:56:3:62:5 | show | controllers/application_controller.rb:6:3:8:5 | set_user | controllers/comments_controller.rb:79:3:81:5 | set_comment |
|
| app/controllers/comments_controller.rb:56:3:62:5 | show | app/controllers/application_controller.rb:6:3:8:5 | set_user | app/controllers/comments_controller.rb:79:3:81:5 | set_comment |
|
||||||
| controllers/comments_controller.rb:56:3:62:5 | show | controllers/application_controller.rb:10:3:12:5 | log_request | controllers/application_controller.rb:6:3:8:5 | set_user |
|
| app/controllers/comments_controller.rb:56:3:62:5 | show | app/controllers/application_controller.rb:10:3:12:5 | log_request | app/controllers/application_controller.rb:6:3:8:5 | set_user |
|
||||||
| controllers/comments_controller.rb:56:3:62:5 | show | controllers/comments_controller.rb:56:3:62:5 | show | controllers/comments_controller.rb:87:3:89:5 | check_feature_flags |
|
| app/controllers/comments_controller.rb:56:3:62:5 | show | app/controllers/comments_controller.rb:56:3:62:5 | show | app/controllers/comments_controller.rb:87:3:89:5 | check_feature_flags |
|
||||||
| controllers/comments_controller.rb:56:3:62:5 | show | controllers/comments_controller.rb:79:3:81:5 | set_comment | controllers/comments_controller.rb:99:3:100:5 | foo |
|
| app/controllers/comments_controller.rb:56:3:62:5 | show | app/controllers/comments_controller.rb:79:3:81:5 | set_comment | app/controllers/comments_controller.rb:99:3:100:5 | foo |
|
||||||
| controllers/comments_controller.rb:56:3:62:5 | show | controllers/comments_controller.rb:87:3:89:5 | check_feature_flags | controllers/comments_controller.rb:95:3:97:5 | this_must_run_last |
|
| app/controllers/comments_controller.rb:56:3:62:5 | show | app/controllers/comments_controller.rb:87:3:89:5 | check_feature_flags | app/controllers/comments_controller.rb:95:3:97:5 | this_must_run_last |
|
||||||
| controllers/comments_controller.rb:56:3:62:5 | show | controllers/comments_controller.rb:91:3:93:5 | this_must_run_first | controllers/application_controller.rb:10:3:12:5 | log_request |
|
| app/controllers/comments_controller.rb:56:3:62:5 | show | app/controllers/comments_controller.rb:91:3:93:5 | this_must_run_first | app/controllers/application_controller.rb:10:3:12:5 | log_request |
|
||||||
| controllers/comments_controller.rb:56:3:62:5 | show | controllers/comments_controller.rb:99:3:100:5 | foo | controllers/comments_controller.rb:102:3:103:5 | bar |
|
| app/controllers/comments_controller.rb:56:3:62:5 | show | app/controllers/comments_controller.rb:99:3:100:5 | foo | app/controllers/comments_controller.rb:102:3:103:5 | bar |
|
||||||
| controllers/comments_controller.rb:56:3:62:5 | show | controllers/comments_controller.rb:102:3:103:5 | bar | controllers/comments_controller.rb:56:3:62:5 | show |
|
| app/controllers/comments_controller.rb:56:3:62:5 | show | app/controllers/comments_controller.rb:102:3:103:5 | bar | app/controllers/comments_controller.rb:56:3:62:5 | show |
|
||||||
| controllers/comments_controller.rb:64:3:66:5 | photo | controllers/application_controller.rb:6:3:8:5 | set_user | controllers/comments_controller.rb:99:3:100:5 | foo |
|
| app/controllers/comments_controller.rb:64:3:66:5 | photo | app/controllers/application_controller.rb:6:3:8:5 | set_user | app/controllers/comments_controller.rb:99:3:100:5 | foo |
|
||||||
| controllers/comments_controller.rb:64:3:66:5 | photo | controllers/application_controller.rb:10:3:12:5 | log_request | controllers/application_controller.rb:6:3:8:5 | set_user |
|
| app/controllers/comments_controller.rb:64:3:66:5 | photo | app/controllers/application_controller.rb:10:3:12:5 | log_request | app/controllers/application_controller.rb:6:3:8:5 | set_user |
|
||||||
| controllers/comments_controller.rb:64:3:66:5 | photo | controllers/comments_controller.rb:64:3:66:5 | photo | controllers/comments_controller.rb:83:3:85:5 | log_comment_change |
|
| app/controllers/comments_controller.rb:64:3:66:5 | photo | app/controllers/comments_controller.rb:64:3:66:5 | photo | app/controllers/comments_controller.rb:83:3:85:5 | log_comment_change |
|
||||||
| controllers/comments_controller.rb:64:3:66:5 | photo | controllers/comments_controller.rb:83:3:85:5 | log_comment_change | controllers/comments_controller.rb:87:3:89:5 | check_feature_flags |
|
| app/controllers/comments_controller.rb:64:3:66:5 | photo | app/controllers/comments_controller.rb:83:3:85:5 | log_comment_change | app/controllers/comments_controller.rb:87:3:89:5 | check_feature_flags |
|
||||||
| controllers/comments_controller.rb:64:3:66:5 | photo | controllers/comments_controller.rb:87:3:89:5 | check_feature_flags | controllers/comments_controller.rb:95:3:97:5 | this_must_run_last |
|
| app/controllers/comments_controller.rb:64:3:66:5 | photo | app/controllers/comments_controller.rb:87:3:89:5 | check_feature_flags | app/controllers/comments_controller.rb:95:3:97:5 | this_must_run_last |
|
||||||
| controllers/comments_controller.rb:64:3:66:5 | photo | controllers/comments_controller.rb:91:3:93:5 | this_must_run_first | controllers/application_controller.rb:10:3:12:5 | log_request |
|
| app/controllers/comments_controller.rb:64:3:66:5 | photo | app/controllers/comments_controller.rb:91:3:93:5 | this_must_run_first | app/controllers/application_controller.rb:10:3:12:5 | log_request |
|
||||||
| controllers/comments_controller.rb:64:3:66:5 | photo | controllers/comments_controller.rb:99:3:100:5 | foo | controllers/comments_controller.rb:102:3:103:5 | bar |
|
| app/controllers/comments_controller.rb:64:3:66:5 | photo | app/controllers/comments_controller.rb:99:3:100:5 | foo | app/controllers/comments_controller.rb:102:3:103:5 | bar |
|
||||||
| controllers/comments_controller.rb:64:3:66:5 | photo | controllers/comments_controller.rb:102:3:103:5 | bar | controllers/comments_controller.rb:64:3:66:5 | photo |
|
| app/controllers/comments_controller.rb:64:3:66:5 | photo | app/controllers/comments_controller.rb:102:3:103:5 | bar | app/controllers/comments_controller.rb:64:3:66:5 | photo |
|
||||||
| controllers/comments_controller.rb:68:3:70:5 | destroy | controllers/application_controller.rb:6:3:8:5 | set_user | controllers/comments_controller.rb:74:3:77:5 | ensure_user_can_edit_comments |
|
| app/controllers/comments_controller.rb:68:3:70:5 | destroy | app/controllers/application_controller.rb:6:3:8:5 | set_user | app/controllers/comments_controller.rb:74:3:77:5 | ensure_user_can_edit_comments |
|
||||||
| controllers/comments_controller.rb:68:3:70:5 | destroy | controllers/application_controller.rb:10:3:12:5 | log_request | controllers/application_controller.rb:6:3:8:5 | set_user |
|
| app/controllers/comments_controller.rb:68:3:70:5 | destroy | app/controllers/application_controller.rb:10:3:12:5 | log_request | app/controllers/application_controller.rb:6:3:8:5 | set_user |
|
||||||
| controllers/comments_controller.rb:68:3:70:5 | destroy | controllers/comments_controller.rb:68:3:70:5 | destroy | controllers/comments_controller.rb:83:3:85:5 | log_comment_change |
|
| app/controllers/comments_controller.rb:68:3:70:5 | destroy | app/controllers/comments_controller.rb:68:3:70:5 | destroy | app/controllers/comments_controller.rb:83:3:85:5 | log_comment_change |
|
||||||
| controllers/comments_controller.rb:68:3:70:5 | destroy | controllers/comments_controller.rb:74:3:77:5 | ensure_user_can_edit_comments | controllers/comments_controller.rb:79:3:81:5 | set_comment |
|
| app/controllers/comments_controller.rb:68:3:70:5 | destroy | app/controllers/comments_controller.rb:74:3:77:5 | ensure_user_can_edit_comments | app/controllers/comments_controller.rb:79:3:81:5 | set_comment |
|
||||||
| controllers/comments_controller.rb:68:3:70:5 | destroy | controllers/comments_controller.rb:79:3:81:5 | set_comment | controllers/comments_controller.rb:99:3:100:5 | foo |
|
| app/controllers/comments_controller.rb:68:3:70:5 | destroy | app/controllers/comments_controller.rb:79:3:81:5 | set_comment | app/controllers/comments_controller.rb:99:3:100:5 | foo |
|
||||||
| controllers/comments_controller.rb:68:3:70:5 | destroy | controllers/comments_controller.rb:83:3:85:5 | log_comment_change | controllers/comments_controller.rb:87:3:89:5 | check_feature_flags |
|
| app/controllers/comments_controller.rb:68:3:70:5 | destroy | app/controllers/comments_controller.rb:83:3:85:5 | log_comment_change | app/controllers/comments_controller.rb:87:3:89:5 | check_feature_flags |
|
||||||
| controllers/comments_controller.rb:68:3:70:5 | destroy | controllers/comments_controller.rb:87:3:89:5 | check_feature_flags | controllers/comments_controller.rb:95:3:97:5 | this_must_run_last |
|
| app/controllers/comments_controller.rb:68:3:70:5 | destroy | app/controllers/comments_controller.rb:87:3:89:5 | check_feature_flags | app/controllers/comments_controller.rb:95:3:97:5 | this_must_run_last |
|
||||||
| controllers/comments_controller.rb:68:3:70:5 | destroy | controllers/comments_controller.rb:91:3:93:5 | this_must_run_first | controllers/application_controller.rb:10:3:12:5 | log_request |
|
| app/controllers/comments_controller.rb:68:3:70:5 | destroy | app/controllers/comments_controller.rb:91:3:93:5 | this_must_run_first | app/controllers/application_controller.rb:10:3:12:5 | log_request |
|
||||||
| controllers/comments_controller.rb:68:3:70:5 | destroy | controllers/comments_controller.rb:99:3:100:5 | foo | controllers/comments_controller.rb:102:3:103:5 | bar |
|
| app/controllers/comments_controller.rb:68:3:70:5 | destroy | app/controllers/comments_controller.rb:99:3:100:5 | foo | app/controllers/comments_controller.rb:102:3:103:5 | bar |
|
||||||
| controllers/comments_controller.rb:68:3:70:5 | destroy | controllers/comments_controller.rb:102:3:103:5 | bar | controllers/comments_controller.rb:68:3:70:5 | destroy |
|
| app/controllers/comments_controller.rb:68:3:70:5 | destroy | app/controllers/comments_controller.rb:102:3:103:5 | bar | app/controllers/comments_controller.rb:68:3:70:5 | destroy |
|
||||||
| controllers/photos_controller.rb:3:3:6:5 | show | controllers/application_controller.rb:10:3:12:5 | log_request | controllers/photos_controller.rb:3:3:6:5 | show |
|
| app/controllers/photos_controller.rb:3:3:6:5 | show | app/controllers/application_controller.rb:10:3:12:5 | log_request | app/controllers/photos_controller.rb:3:3:6:5 | show |
|
||||||
| controllers/photos_controller.rb:3:3:6:5 | show | controllers/photos_controller.rb:3:3:6:5 | show | controllers/photos_controller.rb:8:3:9:5 | foo |
|
| app/controllers/photos_controller.rb:3:3:6:5 | show | app/controllers/photos_controller.rb:3:3:6:5 | show | app/controllers/photos_controller.rb:8:3:9:5 | foo |
|
||||||
| controllers/posts_controller.rb:12:3:15:5 | index | controllers/application_controller.rb:6:3:8:5 | set_user | controllers/posts_controller.rb:12:3:15:5 | index |
|
| app/controllers/posts_controller.rb:12:3:15:5 | index | app/controllers/application_controller.rb:6:3:8:5 | set_user | app/controllers/posts_controller.rb:12:3:15:5 | index |
|
||||||
| controllers/posts_controller.rb:12:3:15:5 | index | controllers/application_controller.rb:10:3:12:5 | log_request | controllers/application_controller.rb:6:3:8:5 | set_user |
|
| app/controllers/posts_controller.rb:12:3:15:5 | index | app/controllers/application_controller.rb:10:3:12:5 | log_request | app/controllers/application_controller.rb:6:3:8:5 | set_user |
|
||||||
| controllers/posts_controller.rb:17:3:18:5 | show | controllers/application_controller.rb:6:3:8:5 | set_user | controllers/posts_controller.rb:17:3:18:5 | show |
|
| app/controllers/posts_controller.rb:17:3:18:5 | show | app/controllers/application_controller.rb:6:3:8:5 | set_user | app/controllers/posts_controller.rb:17:3:18:5 | show |
|
||||||
| controllers/posts_controller.rb:17:3:18:5 | show | controllers/application_controller.rb:10:3:12:5 | log_request | controllers/posts_controller.rb:25:3:27:5 | set_post |
|
| app/controllers/posts_controller.rb:17:3:18:5 | show | app/controllers/application_controller.rb:10:3:12:5 | log_request | app/controllers/posts_controller.rb:25:3:27:5 | set_post |
|
||||||
| controllers/posts_controller.rb:17:3:18:5 | show | controllers/posts_controller.rb:25:3:27:5 | set_post | controllers/application_controller.rb:6:3:8:5 | set_user |
|
| app/controllers/posts_controller.rb:17:3:18:5 | show | app/controllers/posts_controller.rb:25:3:27:5 | set_post | app/controllers/application_controller.rb:6:3:8:5 | set_user |
|
||||||
| controllers/posts_controller.rb:20:3:21:5 | upvote | controllers/application_controller.rb:6:3:8:5 | set_user | controllers/posts_controller.rb:20:3:21:5 | upvote |
|
| app/controllers/posts_controller.rb:20:3:21:5 | upvote | app/controllers/application_controller.rb:6:3:8:5 | set_user | app/controllers/posts_controller.rb:20:3:21:5 | upvote |
|
||||||
| controllers/posts_controller.rb:20:3:21:5 | upvote | controllers/application_controller.rb:10:3:12:5 | log_request | controllers/posts_controller.rb:25:3:27:5 | set_post |
|
| app/controllers/posts_controller.rb:20:3:21:5 | upvote | app/controllers/application_controller.rb:10:3:12:5 | log_request | app/controllers/posts_controller.rb:25:3:27:5 | set_post |
|
||||||
| controllers/posts_controller.rb:20:3:21:5 | upvote | controllers/posts_controller.rb:20:3:21:5 | upvote | controllers/posts_controller.rb:29:3:31:5 | log_upvote |
|
| app/controllers/posts_controller.rb:20:3:21:5 | upvote | app/controllers/posts_controller.rb:20:3:21:5 | upvote | app/controllers/posts_controller.rb:29:3:31:5 | log_upvote |
|
||||||
| controllers/posts_controller.rb:20:3:21:5 | upvote | controllers/posts_controller.rb:25:3:27:5 | set_post | controllers/application_controller.rb:6:3:8:5 | set_user |
|
| app/controllers/posts_controller.rb:20:3:21:5 | upvote | app/controllers/posts_controller.rb:25:3:27:5 | set_post | app/controllers/application_controller.rb:6:3:8:5 | set_user |
|
||||||
| filter_flow.rb:17:3:18:5 | b | filter_flow.rb:13:3:15:5 | a | filter_flow.rb:17:3:18:5 | b |
|
| filter_flow.rb:17:3:18:5 | b | filter_flow.rb:13:3:15:5 | a | filter_flow.rb:17:3:18:5 | b |
|
||||||
| filter_flow.rb:17:3:18:5 | b | filter_flow.rb:17:3:18:5 | b | filter_flow.rb:20:3:22:5 | c |
|
| filter_flow.rb:17:3:18:5 | b | filter_flow.rb:17:3:18:5 | b | filter_flow.rb:20:3:22:5 | c |
|
||||||
| filter_flow.rb:33:3:35:5 | b | filter_flow.rb:29:3:31:5 | a | filter_flow.rb:33:3:35:5 | b |
|
| filter_flow.rb:33:3:35:5 | b | filter_flow.rb:29:3:31:5 | a | filter_flow.rb:33:3:35:5 | b |
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
activeRecordModelClasses
|
activeRecordModelClasses
|
||||||
| ActiveRecord.rb:1:1:3:3 | UserGroup |
|
| ActiveRecord.rb:1:1:3:3 | UserGroup |
|
||||||
| ActiveRecord.rb:5:1:15:3 | User |
|
| ActiveRecord.rb:5:1:19:3 | User |
|
||||||
| ActiveRecord.rb:17:1:21:3 | Admin |
|
| ActiveRecord.rb:21:1:25:3 | Admin |
|
||||||
| associations.rb:1:1:3:3 | Author |
|
| associations.rb:1:1:3:3 | Author |
|
||||||
| associations.rb:5:1:9:3 | Post |
|
| associations.rb:5:1:9:3 | Post |
|
||||||
| associations.rb:11:1:13:3 | Tag |
|
| associations.rb:11:1:13:3 | Tag |
|
||||||
|
@ -10,17 +10,20 @@ activeRecordInstances
|
||||||
| ActiveRecord.rb:9:5:9:68 | call to find |
|
| ActiveRecord.rb:9:5:9:68 | call to find |
|
||||||
| ActiveRecord.rb:13:5:13:40 | call to find_by |
|
| ActiveRecord.rb:13:5:13:40 | call to find_by |
|
||||||
| ActiveRecord.rb:13:5:13:46 | call to users |
|
| ActiveRecord.rb:13:5:13:46 | call to users |
|
||||||
| ActiveRecord.rb:35:5:35:51 | call to authenticate |
|
| ActiveRecord.rb:16:3:18:5 | self (exec) |
|
||||||
| ActiveRecord.rb:36:5:36:30 | call to find_by_name |
|
| ActiveRecord.rb:16:3:18:5 | self in exec |
|
||||||
| ActiveRecord.rb:55:5:57:7 | if ... |
|
| ActiveRecord.rb:17:5:17:14 | self |
|
||||||
| ActiveRecord.rb:55:43:56:40 | then ... |
|
| ActiveRecord.rb:39:5:39:51 | call to authenticate |
|
||||||
| ActiveRecord.rb:56:7:56:40 | call to find_by |
|
| ActiveRecord.rb:40:5:40:30 | call to find_by_name |
|
||||||
| ActiveRecord.rb:60:5:60:33 | call to find_by |
|
| ActiveRecord.rb:59:5:61:7 | if ... |
|
||||||
| ActiveRecord.rb:62:5:62:34 | call to find |
|
| ActiveRecord.rb:59:43:60:40 | then ... |
|
||||||
| ActiveRecord.rb:72:5:72:24 | call to create |
|
| ActiveRecord.rb:60:7:60:40 | call to find_by |
|
||||||
| ActiveRecord.rb:76:5:76:66 | call to create |
|
| ActiveRecord.rb:64:5:64:33 | call to find_by |
|
||||||
| ActiveRecord.rb:80:5:80:68 | call to create |
|
| ActiveRecord.rb:66:5:66:34 | call to find |
|
||||||
| ActiveRecord.rb:84:5:84:16 | call to create |
|
| ActiveRecord.rb:76:5:76:24 | call to create |
|
||||||
|
| ActiveRecord.rb:80:5:80:66 | call to create |
|
||||||
|
| ActiveRecord.rb:84:5:84:68 | call to create |
|
||||||
|
| ActiveRecord.rb:88:5:88:16 | call to create |
|
||||||
| associations.rb:19:1:19:7 | author1 |
|
| associations.rb:19:1:19:7 | author1 |
|
||||||
| associations.rb:19:1:19:20 | ... = ... |
|
| associations.rb:19:1:19:20 | ... = ... |
|
||||||
| associations.rb:19:11:19:20 | call to new |
|
| associations.rb:19:11:19:20 | call to new |
|
||||||
|
@ -105,46 +108,47 @@ activeRecordInstances
|
||||||
| associations.rb:53:1:53:34 | call to find |
|
| associations.rb:53:1:53:34 | call to find |
|
||||||
activeRecordSqlExecutionRanges
|
activeRecordSqlExecutionRanges
|
||||||
| ActiveRecord.rb:9:33:9:67 | "name='#{...}' and pass='#{...}'" |
|
| ActiveRecord.rb:9:33:9:67 | "name='#{...}' and pass='#{...}'" |
|
||||||
| ActiveRecord.rb:19:16:19:24 | condition |
|
| ActiveRecord.rb:17:24:17:24 | q |
|
||||||
| ActiveRecord.rb:28:30:28:44 | ...[...] |
|
| ActiveRecord.rb:23:16:23:24 | condition |
|
||||||
| ActiveRecord.rb:29:20:29:42 | "id = '#{...}'" |
|
| ActiveRecord.rb:32:30:32:44 | ...[...] |
|
||||||
| ActiveRecord.rb:30:21:30:45 | call to [] |
|
| ActiveRecord.rb:33:20:33:42 | "id = '#{...}'" |
|
||||||
| ActiveRecord.rb:31:16:31:21 | <<-SQL |
|
| ActiveRecord.rb:34:21:34:45 | call to [] |
|
||||||
| ActiveRecord.rb:34:20:34:47 | "user.id = '#{...}'" |
|
| ActiveRecord.rb:35:16:35:21 | <<-SQL |
|
||||||
| ActiveRecord.rb:46:20:46:32 | ... + ... |
|
| ActiveRecord.rb:38:20:38:47 | "user.id = '#{...}'" |
|
||||||
| ActiveRecord.rb:52:16:52:28 | "name #{...}" |
|
| ActiveRecord.rb:50:20:50:32 | ... + ... |
|
||||||
| ActiveRecord.rb:56:20:56:39 | "username = #{...}" |
|
| ActiveRecord.rb:56:16:56:28 | "name #{...}" |
|
||||||
| ActiveRecord.rb:68:21:68:44 | ...[...] |
|
| ActiveRecord.rb:60:20:60:39 | "username = #{...}" |
|
||||||
| ActiveRecord.rb:106:27:106:76 | "this is an unsafe annotation:..." |
|
| ActiveRecord.rb:72:21:72:44 | ...[...] |
|
||||||
|
| ActiveRecord.rb:110:27:110:76 | "this is an unsafe annotation:..." |
|
||||||
activeRecordModelClassMethodCalls
|
activeRecordModelClassMethodCalls
|
||||||
| ActiveRecord.rb:2:3:2:17 | call to has_many |
|
| ActiveRecord.rb:2:3:2:17 | call to has_many |
|
||||||
| ActiveRecord.rb:6:3:6:24 | call to belongs_to |
|
| ActiveRecord.rb:6:3:6:24 | call to belongs_to |
|
||||||
| ActiveRecord.rb:9:5:9:68 | call to find |
|
| ActiveRecord.rb:9:5:9:68 | call to find |
|
||||||
| ActiveRecord.rb:13:5:13:40 | call to find_by |
|
| ActiveRecord.rb:13:5:13:40 | call to find_by |
|
||||||
| ActiveRecord.rb:13:5:13:46 | call to users |
|
| ActiveRecord.rb:13:5:13:46 | call to users |
|
||||||
| ActiveRecord.rb:19:5:19:25 | call to destroy_by |
|
| ActiveRecord.rb:23:5:23:25 | call to destroy_by |
|
||||||
| ActiveRecord.rb:28:5:28:45 | call to calculate |
|
| ActiveRecord.rb:32:5:32:45 | call to calculate |
|
||||||
| ActiveRecord.rb:29:5:29:43 | call to delete_by |
|
| ActiveRecord.rb:33:5:33:43 | call to delete_by |
|
||||||
| ActiveRecord.rb:30:5:30:46 | call to destroy_by |
|
| ActiveRecord.rb:34:5:34:46 | call to destroy_by |
|
||||||
| ActiveRecord.rb:31:5:31:35 | call to where |
|
| ActiveRecord.rb:35:5:35:35 | call to where |
|
||||||
| ActiveRecord.rb:34:5:34:14 | call to where |
|
| ActiveRecord.rb:38:5:38:14 | call to where |
|
||||||
| ActiveRecord.rb:34:5:34:48 | call to not |
|
| ActiveRecord.rb:38:5:38:48 | call to not |
|
||||||
| ActiveRecord.rb:36:5:36:30 | call to find_by_name |
|
| ActiveRecord.rb:40:5:40:30 | call to find_by_name |
|
||||||
| ActiveRecord.rb:37:5:37:36 | call to not_a_find_by_method |
|
| ActiveRecord.rb:41:5:41:36 | call to not_a_find_by_method |
|
||||||
| ActiveRecord.rb:46:5:46:33 | call to delete_by |
|
| ActiveRecord.rb:50:5:50:33 | call to delete_by |
|
||||||
| ActiveRecord.rb:52:5:52:29 | call to order |
|
| ActiveRecord.rb:56:5:56:29 | call to order |
|
||||||
| ActiveRecord.rb:56:7:56:40 | call to find_by |
|
| ActiveRecord.rb:60:7:60:40 | call to find_by |
|
||||||
| ActiveRecord.rb:60:5:60:33 | call to find_by |
|
| ActiveRecord.rb:64:5:64:33 | call to find_by |
|
||||||
| ActiveRecord.rb:62:5:62:34 | call to find |
|
| ActiveRecord.rb:66:5:66:34 | call to find |
|
||||||
| ActiveRecord.rb:72:5:72:24 | call to create |
|
| ActiveRecord.rb:76:5:76:24 | call to create |
|
||||||
| ActiveRecord.rb:76:5:76:66 | call to create |
|
| ActiveRecord.rb:80:5:80:66 | call to create |
|
||||||
| ActiveRecord.rb:80:5:80:68 | call to create |
|
| ActiveRecord.rb:84:5:84:68 | call to create |
|
||||||
| ActiveRecord.rb:84:5:84:16 | call to create |
|
| ActiveRecord.rb:88:5:88:16 | call to create |
|
||||||
| ActiveRecord.rb:88:5:88:27 | call to update |
|
| ActiveRecord.rb:92:5:92:27 | call to update |
|
||||||
| ActiveRecord.rb:92:5:92:69 | call to update |
|
| ActiveRecord.rb:96:5:96:69 | call to update |
|
||||||
| ActiveRecord.rb:96:5:96:71 | call to update |
|
| ActiveRecord.rb:100:5:100:71 | call to update |
|
||||||
| ActiveRecord.rb:102:13:102:54 | call to annotate |
|
| ActiveRecord.rb:106:13:106:54 | call to annotate |
|
||||||
| ActiveRecord.rb:106:13:106:77 | call to annotate |
|
| ActiveRecord.rb:110:13:110:77 | call to annotate |
|
||||||
| associations.rb:2:3:2:17 | call to has_many |
|
| associations.rb:2:3:2:17 | call to has_many |
|
||||||
| associations.rb:6:3:6:20 | call to belongs_to |
|
| associations.rb:6:3:6:20 | call to belongs_to |
|
||||||
| associations.rb:7:3:7:20 | call to has_many |
|
| associations.rb:7:3:7:20 | call to has_many |
|
||||||
|
@ -200,41 +204,41 @@ activeRecordModelClassMethodCalls
|
||||||
activeRecordModelClassMethodCallsReplacement
|
activeRecordModelClassMethodCallsReplacement
|
||||||
| ActiveRecord.rb:1:1:3:3 | UserGroup | ActiveRecord.rb:2:3:2:17 | call to has_many |
|
| ActiveRecord.rb:1:1:3:3 | UserGroup | ActiveRecord.rb:2:3:2:17 | call to has_many |
|
||||||
| ActiveRecord.rb:1:1:3:3 | UserGroup | ActiveRecord.rb:13:5:13:40 | call to find_by |
|
| ActiveRecord.rb:1:1:3:3 | UserGroup | ActiveRecord.rb:13:5:13:40 | call to find_by |
|
||||||
| ActiveRecord.rb:5:1:15:3 | User | ActiveRecord.rb:6:3:6:24 | call to belongs_to |
|
| ActiveRecord.rb:5:1:19:3 | User | ActiveRecord.rb:6:3:6:24 | call to belongs_to |
|
||||||
| ActiveRecord.rb:5:1:15:3 | User | ActiveRecord.rb:9:5:9:68 | call to find |
|
| ActiveRecord.rb:5:1:19:3 | User | ActiveRecord.rb:9:5:9:68 | call to find |
|
||||||
| ActiveRecord.rb:5:1:15:3 | User | ActiveRecord.rb:19:5:19:25 | call to destroy_by |
|
| ActiveRecord.rb:5:1:19:3 | User | ActiveRecord.rb:23:5:23:25 | call to destroy_by |
|
||||||
| ActiveRecord.rb:5:1:15:3 | User | ActiveRecord.rb:28:5:28:45 | call to calculate |
|
| ActiveRecord.rb:5:1:19:3 | User | ActiveRecord.rb:32:5:32:45 | call to calculate |
|
||||||
| ActiveRecord.rb:5:1:15:3 | User | ActiveRecord.rb:29:5:29:43 | call to delete_by |
|
| ActiveRecord.rb:5:1:19:3 | User | ActiveRecord.rb:33:5:33:43 | call to delete_by |
|
||||||
| ActiveRecord.rb:5:1:15:3 | User | ActiveRecord.rb:30:5:30:46 | call to destroy_by |
|
| ActiveRecord.rb:5:1:19:3 | User | ActiveRecord.rb:34:5:34:46 | call to destroy_by |
|
||||||
| ActiveRecord.rb:5:1:15:3 | User | ActiveRecord.rb:31:5:31:35 | call to where |
|
| ActiveRecord.rb:5:1:19:3 | User | ActiveRecord.rb:35:5:35:35 | call to where |
|
||||||
| ActiveRecord.rb:5:1:15:3 | User | ActiveRecord.rb:34:5:34:14 | call to where |
|
| ActiveRecord.rb:5:1:19:3 | User | ActiveRecord.rb:38:5:38:14 | call to where |
|
||||||
| ActiveRecord.rb:5:1:15:3 | User | ActiveRecord.rb:35:5:35:51 | call to authenticate |
|
| ActiveRecord.rb:5:1:19:3 | User | ActiveRecord.rb:39:5:39:51 | call to authenticate |
|
||||||
| ActiveRecord.rb:5:1:15:3 | User | ActiveRecord.rb:36:5:36:30 | call to find_by_name |
|
| ActiveRecord.rb:5:1:19:3 | User | ActiveRecord.rb:40:5:40:30 | call to find_by_name |
|
||||||
| ActiveRecord.rb:5:1:15:3 | User | ActiveRecord.rb:37:5:37:36 | call to not_a_find_by_method |
|
| ActiveRecord.rb:5:1:19:3 | User | ActiveRecord.rb:41:5:41:36 | call to not_a_find_by_method |
|
||||||
| ActiveRecord.rb:5:1:15:3 | User | ActiveRecord.rb:46:5:46:33 | call to delete_by |
|
| ActiveRecord.rb:5:1:19:3 | User | ActiveRecord.rb:50:5:50:33 | call to delete_by |
|
||||||
| ActiveRecord.rb:5:1:15:3 | User | ActiveRecord.rb:52:5:52:29 | call to order |
|
| ActiveRecord.rb:5:1:19:3 | User | ActiveRecord.rb:56:5:56:29 | call to order |
|
||||||
| ActiveRecord.rb:5:1:15:3 | User | ActiveRecord.rb:56:7:56:40 | call to find_by |
|
| ActiveRecord.rb:5:1:19:3 | User | ActiveRecord.rb:60:7:60:40 | call to find_by |
|
||||||
| ActiveRecord.rb:5:1:15:3 | User | ActiveRecord.rb:60:5:60:33 | call to find_by |
|
| ActiveRecord.rb:5:1:19:3 | User | ActiveRecord.rb:64:5:64:33 | call to find_by |
|
||||||
| ActiveRecord.rb:5:1:15:3 | User | ActiveRecord.rb:62:5:62:34 | call to find |
|
| ActiveRecord.rb:5:1:19:3 | User | ActiveRecord.rb:66:5:66:34 | call to find |
|
||||||
| ActiveRecord.rb:5:1:15:3 | User | ActiveRecord.rb:68:5:68:45 | call to delete_by |
|
| ActiveRecord.rb:5:1:19:3 | User | ActiveRecord.rb:72:5:72:45 | call to delete_by |
|
||||||
| ActiveRecord.rb:5:1:15:3 | User | ActiveRecord.rb:72:5:72:24 | call to create |
|
| ActiveRecord.rb:5:1:19:3 | User | ActiveRecord.rb:76:5:76:24 | call to create |
|
||||||
| ActiveRecord.rb:5:1:15:3 | User | ActiveRecord.rb:76:5:76:66 | call to create |
|
| ActiveRecord.rb:5:1:19:3 | User | ActiveRecord.rb:80:5:80:66 | call to create |
|
||||||
| ActiveRecord.rb:5:1:15:3 | User | ActiveRecord.rb:80:5:80:68 | call to create |
|
| ActiveRecord.rb:5:1:19:3 | User | ActiveRecord.rb:84:5:84:68 | call to create |
|
||||||
| ActiveRecord.rb:5:1:15:3 | User | ActiveRecord.rb:84:5:84:16 | call to create |
|
| ActiveRecord.rb:5:1:19:3 | User | ActiveRecord.rb:88:5:88:16 | call to create |
|
||||||
| ActiveRecord.rb:5:1:15:3 | User | ActiveRecord.rb:88:5:88:27 | call to update |
|
| ActiveRecord.rb:5:1:19:3 | User | ActiveRecord.rb:92:5:92:27 | call to update |
|
||||||
| ActiveRecord.rb:5:1:15:3 | User | ActiveRecord.rb:92:5:92:69 | call to update |
|
| ActiveRecord.rb:5:1:19:3 | User | ActiveRecord.rb:96:5:96:69 | call to update |
|
||||||
| ActiveRecord.rb:5:1:15:3 | User | ActiveRecord.rb:96:5:96:71 | call to update |
|
| ActiveRecord.rb:5:1:19:3 | User | ActiveRecord.rb:100:5:100:71 | call to update |
|
||||||
| ActiveRecord.rb:5:1:15:3 | User | ActiveRecord.rb:102:13:102:54 | call to annotate |
|
| ActiveRecord.rb:5:1:19:3 | User | ActiveRecord.rb:106:13:106:54 | call to annotate |
|
||||||
| ActiveRecord.rb:5:1:15:3 | User | ActiveRecord.rb:106:13:106:77 | call to annotate |
|
| ActiveRecord.rb:5:1:19:3 | User | ActiveRecord.rb:110:13:110:77 | call to annotate |
|
||||||
| ActiveRecord.rb:17:1:21:3 | Admin | ActiveRecord.rb:19:5:19:25 | call to destroy_by |
|
| ActiveRecord.rb:21:1:25:3 | Admin | ActiveRecord.rb:23:5:23:25 | call to destroy_by |
|
||||||
| ActiveRecord.rb:17:1:21:3 | Admin | ActiveRecord.rb:68:5:68:45 | call to delete_by |
|
| ActiveRecord.rb:21:1:25:3 | Admin | ActiveRecord.rb:72:5:72:45 | call to delete_by |
|
||||||
| ActiveRecord.rb:17:1:21:3 | Admin | ActiveRecord.rb:72:5:72:24 | call to create |
|
| ActiveRecord.rb:21:1:25:3 | Admin | ActiveRecord.rb:76:5:76:24 | call to create |
|
||||||
| ActiveRecord.rb:17:1:21:3 | Admin | ActiveRecord.rb:76:5:76:66 | call to create |
|
| ActiveRecord.rb:21:1:25:3 | Admin | ActiveRecord.rb:80:5:80:66 | call to create |
|
||||||
| ActiveRecord.rb:17:1:21:3 | Admin | ActiveRecord.rb:80:5:80:68 | call to create |
|
| ActiveRecord.rb:21:1:25:3 | Admin | ActiveRecord.rb:84:5:84:68 | call to create |
|
||||||
| ActiveRecord.rb:17:1:21:3 | Admin | ActiveRecord.rb:84:5:84:16 | call to create |
|
| ActiveRecord.rb:21:1:25:3 | Admin | ActiveRecord.rb:88:5:88:16 | call to create |
|
||||||
| ActiveRecord.rb:17:1:21:3 | Admin | ActiveRecord.rb:88:5:88:27 | call to update |
|
| ActiveRecord.rb:21:1:25:3 | Admin | ActiveRecord.rb:92:5:92:27 | call to update |
|
||||||
| ActiveRecord.rb:17:1:21:3 | Admin | ActiveRecord.rb:92:5:92:69 | call to update |
|
| ActiveRecord.rb:21:1:25:3 | Admin | ActiveRecord.rb:96:5:96:69 | call to update |
|
||||||
| ActiveRecord.rb:17:1:21:3 | Admin | ActiveRecord.rb:96:5:96:71 | call to update |
|
| ActiveRecord.rb:21:1:25:3 | Admin | ActiveRecord.rb:100:5:100:71 | call to update |
|
||||||
| associations.rb:1:1:3:3 | Author | associations.rb:2:3:2:17 | call to has_many |
|
| associations.rb:1:1:3:3 | Author | associations.rb:2:3:2:17 | call to has_many |
|
||||||
| associations.rb:1:1:3:3 | Author | associations.rb:19:11:19:20 | call to new |
|
| associations.rb:1:1:3:3 | Author | associations.rb:19:11:19:20 | call to new |
|
||||||
| associations.rb:5:1:9:3 | Post | associations.rb:6:3:6:20 | call to belongs_to |
|
| associations.rb:5:1:9:3 | Post | associations.rb:6:3:6:20 | call to belongs_to |
|
||||||
|
@ -244,28 +248,29 @@ activeRecordModelClassMethodCallsReplacement
|
||||||
| associations.rb:15:1:17:3 | Comment | associations.rb:16:3:16:18 | call to belongs_to |
|
| associations.rb:15:1:17:3 | Comment | associations.rb:16:3:16:18 | call to belongs_to |
|
||||||
potentiallyUnsafeSqlExecutingMethodCall
|
potentiallyUnsafeSqlExecutingMethodCall
|
||||||
| ActiveRecord.rb:9:5:9:68 | call to find |
|
| ActiveRecord.rb:9:5:9:68 | call to find |
|
||||||
| ActiveRecord.rb:19:5:19:25 | call to destroy_by |
|
| ActiveRecord.rb:23:5:23:25 | call to destroy_by |
|
||||||
| ActiveRecord.rb:28:5:28:45 | call to calculate |
|
| ActiveRecord.rb:32:5:32:45 | call to calculate |
|
||||||
| ActiveRecord.rb:29:5:29:43 | call to delete_by |
|
| ActiveRecord.rb:33:5:33:43 | call to delete_by |
|
||||||
| ActiveRecord.rb:30:5:30:46 | call to destroy_by |
|
| ActiveRecord.rb:34:5:34:46 | call to destroy_by |
|
||||||
| ActiveRecord.rb:31:5:31:35 | call to where |
|
| ActiveRecord.rb:35:5:35:35 | call to where |
|
||||||
| ActiveRecord.rb:34:5:34:48 | call to not |
|
| ActiveRecord.rb:38:5:38:48 | call to not |
|
||||||
| ActiveRecord.rb:46:5:46:33 | call to delete_by |
|
| ActiveRecord.rb:50:5:50:33 | call to delete_by |
|
||||||
| ActiveRecord.rb:52:5:52:29 | call to order |
|
| ActiveRecord.rb:56:5:56:29 | call to order |
|
||||||
| ActiveRecord.rb:56:7:56:40 | call to find_by |
|
| ActiveRecord.rb:60:7:60:40 | call to find_by |
|
||||||
| ActiveRecord.rb:106:13:106:77 | call to annotate |
|
| ActiveRecord.rb:110:13:110:77 | call to annotate |
|
||||||
activeRecordModelInstantiations
|
activeRecordModelInstantiations
|
||||||
| ActiveRecord.rb:9:5:9:68 | call to find | ActiveRecord.rb:5:1:15:3 | User |
|
| ActiveRecord.rb:9:5:9:68 | call to find | ActiveRecord.rb:5:1:19:3 | User |
|
||||||
| ActiveRecord.rb:13:5:13:40 | call to find_by | ActiveRecord.rb:1:1:3:3 | UserGroup |
|
| ActiveRecord.rb:13:5:13:40 | call to find_by | ActiveRecord.rb:1:1:3:3 | UserGroup |
|
||||||
| ActiveRecord.rb:13:5:13:46 | call to users | ActiveRecord.rb:5:1:15:3 | User |
|
| ActiveRecord.rb:13:5:13:46 | call to users | ActiveRecord.rb:5:1:19:3 | User |
|
||||||
| ActiveRecord.rb:36:5:36:30 | call to find_by_name | ActiveRecord.rb:5:1:15:3 | User |
|
| ActiveRecord.rb:16:3:18:5 | self in exec | ActiveRecord.rb:5:1:19:3 | User |
|
||||||
| ActiveRecord.rb:56:7:56:40 | call to find_by | ActiveRecord.rb:5:1:15:3 | User |
|
| ActiveRecord.rb:40:5:40:30 | call to find_by_name | ActiveRecord.rb:5:1:19:3 | User |
|
||||||
| ActiveRecord.rb:60:5:60:33 | call to find_by | ActiveRecord.rb:5:1:15:3 | User |
|
| ActiveRecord.rb:60:7:60:40 | call to find_by | ActiveRecord.rb:5:1:19:3 | User |
|
||||||
| ActiveRecord.rb:62:5:62:34 | call to find | ActiveRecord.rb:5:1:15:3 | User |
|
| ActiveRecord.rb:64:5:64:33 | call to find_by | ActiveRecord.rb:5:1:19:3 | User |
|
||||||
| ActiveRecord.rb:72:5:72:24 | call to create | ActiveRecord.rb:17:1:21:3 | Admin |
|
| ActiveRecord.rb:66:5:66:34 | call to find | ActiveRecord.rb:5:1:19:3 | User |
|
||||||
| ActiveRecord.rb:76:5:76:66 | call to create | ActiveRecord.rb:17:1:21:3 | Admin |
|
| ActiveRecord.rb:76:5:76:24 | call to create | ActiveRecord.rb:21:1:25:3 | Admin |
|
||||||
| ActiveRecord.rb:80:5:80:68 | call to create | ActiveRecord.rb:17:1:21:3 | Admin |
|
| ActiveRecord.rb:80:5:80:66 | call to create | ActiveRecord.rb:21:1:25:3 | Admin |
|
||||||
| ActiveRecord.rb:84:5:84:16 | call to create | ActiveRecord.rb:17:1:21:3 | Admin |
|
| ActiveRecord.rb:84:5:84:68 | call to create | ActiveRecord.rb:21:1:25:3 | Admin |
|
||||||
|
| ActiveRecord.rb:88:5:88:16 | call to create | ActiveRecord.rb:21:1:25:3 | Admin |
|
||||||
| associations.rb:19:11:19:20 | call to new | associations.rb:1:1:3:3 | Author |
|
| associations.rb:19:11:19:20 | call to new | associations.rb:1:1:3:3 | Author |
|
||||||
| associations.rb:21:9:21:21 | call to posts | associations.rb:5:1:9:3 | Post |
|
| associations.rb:21:9:21:21 | call to posts | associations.rb:5:1:9:3 | Post |
|
||||||
| associations.rb:21:9:21:28 | call to create | associations.rb:5:1:9:3 | Post |
|
| associations.rb:21:9:21:28 | call to create | associations.rb:5:1:9:3 | Post |
|
||||||
|
@ -307,13 +312,13 @@ activeRecordModelInstantiations
|
||||||
| associations.rb:53:1:53:13 | call to posts | associations.rb:5:1:9:3 | Post |
|
| associations.rb:53:1:53:13 | call to posts | associations.rb:5:1:9:3 | Post |
|
||||||
| associations.rb:53:1:53:20 | call to reload | associations.rb:5:1:9:3 | Post |
|
| associations.rb:53:1:53:20 | call to reload | associations.rb:5:1:9:3 | Post |
|
||||||
persistentWriteAccesses
|
persistentWriteAccesses
|
||||||
| ActiveRecord.rb:72:5:72:24 | call to create | ActiveRecord.rb:72:18:72:23 | call to params |
|
| ActiveRecord.rb:76:5:76:24 | call to create | ActiveRecord.rb:76:18:76:23 | call to params |
|
||||||
| ActiveRecord.rb:76:5:76:66 | call to create | ActiveRecord.rb:76:24:76:36 | ...[...] |
|
| ActiveRecord.rb:80:5:80:66 | call to create | ActiveRecord.rb:80:24:80:36 | ...[...] |
|
||||||
| ActiveRecord.rb:76:5:76:66 | call to create | ActiveRecord.rb:76:49:76:65 | ...[...] |
|
| ActiveRecord.rb:80:5:80:66 | call to create | ActiveRecord.rb:80:49:80:65 | ...[...] |
|
||||||
| ActiveRecord.rb:80:5:80:68 | call to create | ActiveRecord.rb:80:25:80:37 | ...[...] |
|
| ActiveRecord.rb:84:5:84:68 | call to create | ActiveRecord.rb:84:25:84:37 | ...[...] |
|
||||||
| ActiveRecord.rb:80:5:80:68 | call to create | ActiveRecord.rb:80:50:80:66 | ...[...] |
|
| ActiveRecord.rb:84:5:84:68 | call to create | ActiveRecord.rb:84:50:84:66 | ...[...] |
|
||||||
| ActiveRecord.rb:88:5:88:27 | call to update | ActiveRecord.rb:88:21:88:26 | call to params |
|
| ActiveRecord.rb:92:5:92:27 | call to update | ActiveRecord.rb:92:21:92:26 | call to params |
|
||||||
| ActiveRecord.rb:92:5:92:69 | call to update | ActiveRecord.rb:92:27:92:39 | ...[...] |
|
| ActiveRecord.rb:96:5:96:69 | call to update | ActiveRecord.rb:96:27:96:39 | ...[...] |
|
||||||
| ActiveRecord.rb:92:5:92:69 | call to update | ActiveRecord.rb:92:52:92:68 | ...[...] |
|
| ActiveRecord.rb:96:5:96:69 | call to update | ActiveRecord.rb:96:52:96:68 | ...[...] |
|
||||||
| ActiveRecord.rb:96:5:96:71 | call to update | ActiveRecord.rb:96:21:96:70 | call to [] |
|
| ActiveRecord.rb:100:5:100:71 | call to update | ActiveRecord.rb:100:21:100:70 | call to [] |
|
||||||
| associations.rb:31:16:31:22 | ... = ... | associations.rb:31:16:31:22 | author2 |
|
| associations.rb:31:16:31:22 | ... = ... | associations.rb:31:16:31:22 | author2 |
|
||||||
|
|
|
@ -12,6 +12,10 @@ class User < ApplicationRecord
|
||||||
def self.from(user_group_id)
|
def self.from(user_group_id)
|
||||||
UserGroup.find_by(id: user_group_id).users
|
UserGroup.find_by(id: user_group_id).users
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def exec(q)
|
||||||
|
connection.execute(q)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
class Admin < User
|
class Admin < User
|
||||||
|
|
Загрузка…
Ссылка в новой задаче