Merge branch 'main' into redsun82/bzlmod

This commit is contained in:
Paolo Tranquilli 2024-02-12 16:03:50 +01:00
Родитель c0eeb7a34e 3d9f9afa77
Коммит a944443d39
58 изменённых файлов: 1071 добавлений и 406 удалений

Просмотреть файл

@ -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"));

Просмотреть файл

@ -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; }
}
}

Просмотреть файл

@ -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; }

Просмотреть файл

@ -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){}
}

Просмотреть файл

@ -0,0 +1,9 @@
// Generated automatically from android.security.identity.PersonalizationData for testing purposes
package android.security.identity;
public class PersonalizationData
{
protected PersonalizationData() {}
}

Просмотреть файл

@ -0,0 +1,9 @@
// Generated automatically from android.security.identity.PresentationSession for testing purposes
package android.security.identity;
public class PresentationSession
{
protected PresentationSession() {}
}

Просмотреть файл

@ -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){}
} }

Просмотреть файл

@ -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