sonatype-lift[bot] commented on code in PR #1307:
URL: https://github.com/apache/solr/pull/1307#discussion_r1083883916
##########
solr/core/src/java/org/apache/solr/rest/ManagedResourceStorage.java:
##########
@@ -48,145 +50,155 @@
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import static org.apache.solr.common.util.Utils.toJSONString;
-
/**
- * Abstract base class that provides most of the functionality needed
- * to store arbitrary data for managed resources. Concrete implementations
- * need to decide the underlying format that data is stored in, such as JSON.
- *
- * The underlying storage I/O layer will be determined by the environment
- * Solr is running in, e.g. in cloud mode, data will be stored and loaded
- * from ZooKeeper.
+ * Abstract base class that provides most of the functionality needed to store
arbitrary data for
+ * managed resources. Concrete implementations need to decide the underlying
format that data is
+ * stored in, such as JSON.
+ *
+ * <p>The underlying storage I/O layer will be determined by the environment
Solr is running in,
+ * e.g. in cloud mode, data will be stored and loaded from ZooKeeper.
*/
public abstract class ManagedResourceStorage {
-
+
/**
- * Hides the underlying storage implementation for data being managed
- * by a ManagedResource. For instance, a ManagedResource may use JSON as
- * the data format and an instance of this class to persist and load
- * the JSON bytes to/from some backing store, such as ZooKeeper.
+ * Hides the underlying storage implementation for data being managed by a
ManagedResource. For
+ * instance, a ManagedResource may use JSON as the data format and an
instance of this class to
+ * persist and load the JSON bytes to/from some backing store, such as
ZooKeeper.
*/
public static interface StorageIO {
String getInfo();
+
void configure(SolrResourceLoader loader, NamedList<String> initArgs)
throws SolrException;
+
boolean exists(String storedResourceId) throws IOException;
- InputStream openInputStream(String storedResourceId) throws IOException;
+
+ InputStream openInputStream(String storedResourceId) throws IOException;
+
OutputStream openOutputStream(String storedResourceId) throws IOException;
+
boolean delete(String storedResourceId) throws IOException;
}
-
- public static final String STORAGE_IO_CLASS_INIT_ARG = "storageIO";
+
+ public static final String STORAGE_IO_CLASS_INIT_ARG = "storageIO";
public static final String STORAGE_DIR_INIT_ARG = "storageDir";
-
+
/**
- * Creates a new StorageIO instance for a Solr core, taking into account
- * whether the core is running in cloud mode as well as initArgs.
+ * Creates a new StorageIO instance for a Solr core, taking into account
whether the core is
+ * running in cloud mode as well as initArgs.
*/
- public static StorageIO newStorageIO(String collection, SolrResourceLoader
resourceLoader, NamedList<String> initArgs) {
+ public static StorageIO newStorageIO(
+ String collection, SolrResourceLoader resourceLoader, NamedList<String>
initArgs) {
StorageIO storageIO;
SolrZkClient zkClient = null;
String configName = null;
if (resourceLoader instanceof ZkSolrResourceLoader) {
- zkClient =
((ZkSolrResourceLoader)resourceLoader).getZkController().getZkClient();
+ zkClient = ((ZkSolrResourceLoader)
resourceLoader).getZkController().getZkClient();
try {
- final ZkStateReader zkStateReader =
((ZkSolrResourceLoader)resourceLoader).getZkController().getZkStateReader();
+ final ZkStateReader zkStateReader =
+ ((ZkSolrResourceLoader)
resourceLoader).getZkController().getZkStateReader();
configName =
zkStateReader.getClusterState().getCollection(collection).getConfigName();
} catch (Exception e) {
log.error("Failed to get config name due to", e);
- throw new SolrException(ErrorCode.SERVER_ERROR,
- "Failed to load config name for collection:" + collection + " due
to: ", e);
+ throw new SolrException(
+ ErrorCode.SERVER_ERROR,
+ "Failed to load config name for collection:" + collection + " due
to: ",
+ e);
}
if (configName == null) {
- throw new SolrException(ErrorCode.SERVER_ERROR,
- "Could not find config name for collection:" + collection);
+ throw new SolrException(
+ ErrorCode.SERVER_ERROR, "Could not find config name for
collection:" + collection);
}
}
-
+
if (initArgs.get(STORAGE_IO_CLASS_INIT_ARG) != null) {
- storageIO =
resourceLoader.newInstance(initArgs.get(STORAGE_IO_CLASS_INIT_ARG),
StorageIO.class);
+ storageIO =
+ resourceLoader.newInstance(initArgs.get(STORAGE_IO_CLASS_INIT_ARG),
StorageIO.class);
} else {
if (zkClient != null) {
- String znodeBase = "/configs/"+configName;
- log.debug("Setting up ZooKeeper-based storage for the RestManager with
znodeBase: {}", znodeBase);
+ String znodeBase = "/configs/" + configName;
+ log.debug(
+ "Setting up ZooKeeper-based storage for the RestManager with
znodeBase: {}", znodeBase);
storageIO = new ManagedResourceStorage.ZooKeeperStorageIO(zkClient,
znodeBase);
} else {
- storageIO = new FileStorageIO();
+ storageIO = new FileStorageIO();
}
}
-
+
if (storageIO instanceof FileStorageIO) {
- // using local fs, if storageDir is not set in the solrconfig.xml,
assume the configDir for the core
+ // using local fs, if storageDir is not set in the solrconfig.xml,
assume the configDir for
+ // the core
if (initArgs.get(STORAGE_DIR_INIT_ARG) == null) {
- File configDir = new File(resourceLoader.getConfigDir());
- boolean hasAccess = false;
+ Path configDir = resourceLoader.getConfigPath();
+ boolean hasAccess;
try {
- hasAccess = configDir.isDirectory() && configDir.canWrite();
- } catch (java.security.AccessControlException ace) {}
-
+ hasAccess = Files.isDirectory(configDir) &&
Files.isWritable(configDir);
+ } catch (SecurityException noAccess) {
+ hasAccess = false;
+ }
+
if (hasAccess) {
- initArgs.add(STORAGE_DIR_INIT_ARG, configDir.getAbsolutePath());
+ initArgs.add(STORAGE_DIR_INIT_ARG,
configDir.toAbsolutePath().toString());
} else {
- // most likely this is because of a unit test
+ // most likely this is because of a unit test
// that doesn't have write-access to the config dir
// while this failover approach is not ideal, it's better
// than causing the core to fail esp. if managed resources aren't
being used
- log.warn("Cannot write to config directory {} ; switching to use
InMemory storage instead.", configDir.getAbsolutePath());
+ log.warn(
+ "Cannot write to config directory {} ; switching to use InMemory
storage instead.",
+ configDir.toAbsolutePath());
storageIO = new ManagedResourceStorage.InMemoryStorageIO();
}
- }
+ }
}
-
- storageIO.configure(resourceLoader, initArgs);
-
+
+ storageIO.configure(resourceLoader, initArgs);
+
return storageIO;
}
-
- /**
- * Local file-based storage implementation.
- */
+
+ /** Local file-based storage implementation. */
public static class FileStorageIO implements StorageIO {
private String storageDir;
-
+
@Override
- public void configure(SolrResourceLoader loader, NamedList<String>
initArgs) throws SolrException {
+ public void configure(SolrResourceLoader loader, NamedList<String>
initArgs)
+ throws SolrException {
String storageDirArg = initArgs.get(STORAGE_DIR_INIT_ARG);
-
+
if (storageDirArg == null || storageDirArg.trim().length() == 0)
- throw new IllegalArgumentException("Required configuration parameter
'"+
- STORAGE_DIR_INIT_ARG+"' not provided!");
-
+ throw new IllegalArgumentException(
+ "Required configuration parameter '" + STORAGE_DIR_INIT_ARG + "'
not provided!");
+
File dir = new File(storageDirArg);
- if (!dir.isDirectory())
- dir.mkdirs();
+ if (!dir.isDirectory()) dir.mkdirs();
- storageDir = dir.getAbsolutePath();
+ storageDir = dir.getAbsolutePath();
log.info("File-based storage initialized to use dir: {}", storageDir);
}
-
+
@Override
public boolean exists(String storedResourceId) throws IOException {
return (new File(storageDir, storedResourceId)).exists();
- }
-
+ }
+
@Override
public InputStream openInputStream(String storedResourceId) throws
IOException {
- return new FileInputStream(storageDir+"/"+storedResourceId);
+ return new FileInputStream(storageDir + "/" + storedResourceId);
}
@Override
public OutputStream openOutputStream(String storedResourceId) throws
IOException {
- return new FileOutputStream(storageDir+"/"+storedResourceId);
+ return new FileOutputStream(storageDir + "/" + storedResourceId);
Review Comment:
đŦ 3 similar findings have been found in this PR
---
*[PATH_TRAVERSAL_OUT](https://find-sec-bugs.github.io/bugs.htm#PATH_TRAVERSAL_OUT):*
This API (java/io/FileOutputStream.<init>(Ljava/lang/String;)V) writes to a
file whose location might be specified by user input
---
<details><summary><b>đ Expand here to view all instances of this
finding</b></summary><br/>
<div align=\"center\">
| **File Path** | **Line Number** |
| ------------- | ------------- |
| solr/core/src/java/org/apache/solr/response/BinaryResponseWriter.java |
[67](https://github.com/apache/solr/blob/a33ba6bb6cf2e46fb136f879a6bc5696b8f779d8/solr/core/src/java/org/apache/solr/response/BinaryResponseWriter.java#L67)
|
| solr/core/src/java/org/apache/solr/util/ExportTool.java |
[253](https://github.com/apache/solr/blob/a33ba6bb6cf2e46fb136f879a6bc5696b8f779d8/solr/core/src/java/org/apache/solr/util/ExportTool.java#L253)
|
| solr/core/src/java/org/apache/solr/util/ExportTool.java |
[327](https://github.com/apache/solr/blob/a33ba6bb6cf2e46fb136f879a6bc5696b8f779d8/solr/core/src/java/org/apache/solr/util/ExportTool.java#L327)
|
<p><a
href="https://lift.sonatype.com/results/github.com/apache/solr/01GQEZBSKB0V8KWDB2MGK5EH8N?t=FindSecBugs|PATH_TRAVERSAL_OUT"
target="_blank">Visit the Lift Web Console</a> to find more details in your
report.</p></div></details>
---
<details><summary><b>âšī¸ Learn about @sonatype-lift commands</b></summary>
You can reply with the following commands. For example, reply with
***@sonatype-lift ignoreall*** to leave out all findings.
| **Command** | **Usage** |
| ------------- | ------------- |
| `@sonatype-lift ignore` | Leave out the above finding from this PR |
| `@sonatype-lift ignoreall` | Leave out all the existing findings from this
PR |
| `@sonatype-lift exclude <file\|issue\|path\|tool>` | Exclude specified
`file\|issue\|path\|tool` from Lift findings by updating your config.toml file |
**Note:** When talking to LiftBot, you need to **refresh** the page to see
its response.
<sub>[Click here](https://github.com/apps/sonatype-lift/installations/new)
to add LiftBot to another repo.</sub></details>
---
Was this a good recommendation?
[ [đ Not
relevant](https://www.sonatype.com/lift-comment-rating?comment=371756028&lift_comment_rating=1)
] - [ [đ Won't
fix](https://www.sonatype.com/lift-comment-rating?comment=371756028&lift_comment_rating=2)
] - [ [đ Not critical, will
fix](https://www.sonatype.com/lift-comment-rating?comment=371756028&lift_comment_rating=3)
] - [ [đ Critical, will
fix](https://www.sonatype.com/lift-comment-rating?comment=371756028&lift_comment_rating=4)
] - [ [đ Critical, fixing
now](https://www.sonatype.com/lift-comment-rating?comment=371756028&lift_comment_rating=5)
]
##########
solr/core/src/java/org/apache/solr/util/SimplePostTool.java:
##########
@@ -1135,30 +1225,33 @@ public PageFetcherResult readPageFromUrl(URL u) throws
URISyntaxException {
PageFetcherResult res = new PageFetcherResult();
try {
if (isDisallowedByRobots(u)) {
- warn("The URL "+u+" is disallowed by robots.txt and will not be
crawled.");
+ warn("The URL " + u + " is disallowed by robots.txt and will not be
crawled.");
res.httpStatus = 403;
URI uri = u.toURI();
visited.add(uri);
return res;
}
res.httpStatus = 404;
HttpURLConnection conn = (HttpURLConnection) u.openConnection();
Review Comment:
<picture><img alt="13% of developers fix this issue"
src="https://lift.sonatype.com/api/commentimage/fixrate/13/display.svg"></picture>
đŦ 8 similar findings have been found in this PR
---
*[URLCONNECTION_SSRF_FD](https://find-sec-bugs.github.io/bugs.htm#URLCONNECTION_SSRF_FD):*
This web server request could be used by an attacker to expose internal
services and filesystem.
---
<details><summary><b>đ Expand here to view all instances of this
finding</b></summary><br/>
<div align=\"center\">
| **File Path** | **Line Number** |
| ------------- | ------------- |
| solr/core/src/java/org/apache/solr/util/CryptoKeys.java |
[278](https://github.com/apache/solr/blob/a33ba6bb6cf2e46fb136f879a6bc5696b8f779d8/solr/core/src/java/org/apache/solr/util/CryptoKeys.java#L278)
|
| solr/solrj/src/java/org/apache/solr/common/util/ContentStreamBase.java |
[150](https://github.com/apache/solr/blob/a33ba6bb6cf2e46fb136f879a6bc5696b8f779d8/solr/solrj/src/java/org/apache/solr/common/util/ContentStreamBase.java#L150)
|
| solr/core/src/java/org/apache/solr/packagemanager/RepositoryManager.java |
[132](https://github.com/apache/solr/blob/a33ba6bb6cf2e46fb136f879a6bc5696b8f779d8/solr/core/src/java/org/apache/solr/packagemanager/RepositoryManager.java#L132)
|
| solr/core/src/java/org/apache/solr/util/SimplePostTool.java |
[999](https://github.com/apache/solr/blob/a33ba6bb6cf2e46fb136f879a6bc5696b8f779d8/solr/core/src/java/org/apache/solr/util/SimplePostTool.java#L999)
|
|
solr/test-framework/src/java/org/apache/solr/handler/TestRestoreCoreUtil.java |
[41](https://github.com/apache/solr/blob/a33ba6bb6cf2e46fb136f879a6bc5696b8f779d8/solr/test-framework/src/java/org/apache/solr/handler/TestRestoreCoreUtil.java#L41)
|
|
solr/modules/jwt-auth/src/java/org/apache/solr/security/jwt/JWTIssuerConfig.java
|
[465](https://github.com/apache/solr/blob/a33ba6bb6cf2e46fb136f879a6bc5696b8f779d8/solr/modules/jwt-auth/src/java/org/apache/solr/security/jwt/JWTIssuerConfig.java#L465)
|
| solr/core/src/java/org/apache/solr/util/SimplePostTool.java |
[975](https://github.com/apache/solr/blob/a33ba6bb6cf2e46fb136f879a6bc5696b8f779d8/solr/core/src/java/org/apache/solr/util/SimplePostTool.java#L975)
|
|
solr/test-framework/src/java/org/apache/solr/handler/BackupRestoreUtils.java |
[116](https://github.com/apache/solr/blob/a33ba6bb6cf2e46fb136f879a6bc5696b8f779d8/solr/test-framework/src/java/org/apache/solr/handler/BackupRestoreUtils.java#L116)
|
<p><a
href="https://lift.sonatype.com/results/github.com/apache/solr/01GQEZBSKB0V8KWDB2MGK5EH8N?t=FindSecBugs|URLCONNECTION_SSRF_FD"
target="_blank">Visit the Lift Web Console</a> to find more details in your
report.</p></div></details>
---
<details><summary><b>âšī¸ Learn about @sonatype-lift commands</b></summary>
You can reply with the following commands. For example, reply with
***@sonatype-lift ignoreall*** to leave out all findings.
| **Command** | **Usage** |
| ------------- | ------------- |
| `@sonatype-lift ignore` | Leave out the above finding from this PR |
| `@sonatype-lift ignoreall` | Leave out all the existing findings from this
PR |
| `@sonatype-lift exclude <file\|issue\|path\|tool>` | Exclude specified
`file\|issue\|path\|tool` from Lift findings by updating your config.toml file |
**Note:** When talking to LiftBot, you need to **refresh** the page to see
its response.
<sub>[Click here](https://github.com/apps/sonatype-lift/installations/new)
to add LiftBot to another repo.</sub></details>
---
Was this a good recommendation?
[ [đ Not
relevant](https://www.sonatype.com/lift-comment-rating?comment=371756029&lift_comment_rating=1)
] - [ [đ Won't
fix](https://www.sonatype.com/lift-comment-rating?comment=371756029&lift_comment_rating=2)
] - [ [đ Not critical, will
fix](https://www.sonatype.com/lift-comment-rating?comment=371756029&lift_comment_rating=3)
] - [ [đ Critical, will
fix](https://www.sonatype.com/lift-comment-rating?comment=371756029&lift_comment_rating=4)
] - [ [đ Critical, fixing
now](https://www.sonatype.com/lift-comment-rating?comment=371756029&lift_comment_rating=5)
]
##########
solr/core/src/java/org/apache/solr/util/SolrPluginUtils.java:
##########
@@ -787,36 +730,36 @@ public static CharSequence partialEscape(CharSequence s) {
// Pattern to detect dangling operator(s) at end of query
// \s+[-+\s]+$
- private final static Pattern DANGLING_OP_PATTERN = Pattern.compile(
"\\s+[-+\\s]+$" );
+ private static final Pattern DANGLING_OP_PATTERN =
Pattern.compile("\\s+[-+\\s]+$");
// Pattern to detect consecutive + and/or - operators
// \s+[+-](?:\s*[+-]+)+
- private final static Pattern CONSECUTIVE_OP_PATTERN = Pattern.compile(
"\\s+[+-](?:\\s*[+-]+)+" );
+ private static final Pattern CONSECUTIVE_OP_PATTERN =
Pattern.compile("\\s+[+-](?:\\s*[+-]+)+");
Review Comment:
đŦ 4 similar findings have been found in this PR
---
*[REDOS](https://find-sec-bugs.github.io/bugs.htm#REDOS):* The regular
expression "\\s+[+-](?:\\s*[+-]+)+" is vulnerable to a denial of service attack
(ReDOS)
---
<details><summary><b>đ Expand here to view all instances of this
finding</b></summary><br/>
<div align=\"center\">
| **File Path** | **Line Number** |
| ------------- | ------------- |
|
solr/prometheus-exporter/src/java/org/apache/solr/prometheus/exporter/MetricsQueryTemplate.java
|
[41](https://github.com/apache/solr/blob/a33ba6bb6cf2e46fb136f879a6bc5696b8f779d8/solr/prometheus-exporter/src/java/org/apache/solr/prometheus/exporter/MetricsQueryTemplate.java#L41)
|
| solr/test-framework/src/java/org/apache/solr/util/SSLTestConfig.java |
[428](https://github.com/apache/solr/blob/a33ba6bb6cf2e46fb136f879a6bc5696b8f779d8/solr/test-framework/src/java/org/apache/solr/util/SSLTestConfig.java#L428)
|
|
solr/solrj-zookeeper/src/java/org/apache/solr/common/cloud/ZkDynamicConfig.java
|
[39](https://github.com/apache/solr/blob/a33ba6bb6cf2e46fb136f879a6bc5696b8f779d8/solr/solrj-zookeeper/src/java/org/apache/solr/common/cloud/ZkDynamicConfig.java#L39)
|
| solr/core/src/java/org/apache/solr/handler/admin/SolrEnvironment.java |
[36](https://github.com/apache/solr/blob/a33ba6bb6cf2e46fb136f879a6bc5696b8f779d8/solr/core/src/java/org/apache/solr/handler/admin/SolrEnvironment.java#L36)
|
<p><a
href="https://lift.sonatype.com/results/github.com/apache/solr/01GQEZBSKB0V8KWDB2MGK5EH8N?t=FindSecBugs|REDOS"
target="_blank">Visit the Lift Web Console</a> to find more details in your
report.</p></div></details>
---
<details><summary><b>âšī¸ Learn about @sonatype-lift commands</b></summary>
You can reply with the following commands. For example, reply with
***@sonatype-lift ignoreall*** to leave out all findings.
| **Command** | **Usage** |
| ------------- | ------------- |
| `@sonatype-lift ignore` | Leave out the above finding from this PR |
| `@sonatype-lift ignoreall` | Leave out all the existing findings from this
PR |
| `@sonatype-lift exclude <file\|issue\|path\|tool>` | Exclude specified
`file\|issue\|path\|tool` from Lift findings by updating your config.toml file |
**Note:** When talking to LiftBot, you need to **refresh** the page to see
its response.
<sub>[Click here](https://github.com/apps/sonatype-lift/installations/new)
to add LiftBot to another repo.</sub></details>
---
Was this a good recommendation?
[ [đ Not
relevant](https://www.sonatype.com/lift-comment-rating?comment=371756051&lift_comment_rating=1)
] - [ [đ Won't
fix](https://www.sonatype.com/lift-comment-rating?comment=371756051&lift_comment_rating=2)
] - [ [đ Not critical, will
fix](https://www.sonatype.com/lift-comment-rating?comment=371756051&lift_comment_rating=3)
] - [ [đ Critical, will
fix](https://www.sonatype.com/lift-comment-rating?comment=371756051&lift_comment_rating=4)
] - [ [đ Critical, fixing
now](https://www.sonatype.com/lift-comment-rating?comment=371756051&lift_comment_rating=5)
]
##########
solr/core/src/java/org/apache/solr/security/MultiAuthPlugin.java:
##########
@@ -185,7 +210,8 @@ public boolean doAuthenticate(HttpServletRequest request,
HttpServletResponse re
final String scheme = getSchemeFromAuthHeader(authHeader);
final AuthenticationPlugin plugin = pluginMap.get(scheme);
if (plugin == null) {
- response.sendError(ErrorCode.UNAUTHORIZED.code, "Authorization scheme '"
+ scheme + "' not supported!");
+ response.sendError(
Review Comment:
đŦ 4 similar findings have been found in this PR
---
*[XSS_SERVLET](https://find-sec-bugs.github.io/bugs.htm#XSS_SERVLET):* This
use of javax/servlet/http/HttpServletResponse.sendError(ILjava/lang/String;)V
could be vulnerable to XSS in the Servlet
---
<details><summary><b>đ Expand here to view all instances of this
finding</b></summary><br/>
<div align=\"center\">
| **File Path** | **Line Number** |
| ------------- | ------------- |
| solr/core/src/java/org/apache/solr/servlet/HttpSolrCall.java |
[854](https://github.com/apache/solr/blob/a33ba6bb6cf2e46fb136f879a6bc5696b8f779d8/solr/core/src/java/org/apache/solr/servlet/HttpSolrCall.java#L854)
|
| solr/core/src/java/org/apache/solr/security/PKIAuthenticationPlugin.java |
[204](https://github.com/apache/solr/blob/a33ba6bb6cf2e46fb136f879a6bc5696b8f779d8/solr/core/src/java/org/apache/solr/security/PKIAuthenticationPlugin.java#L204)
|
| solr/test-framework/src/java/org/apache/solr/embedded/JettySolrRunner.java
|
[890](https://github.com/apache/solr/blob/a33ba6bb6cf2e46fb136f879a6bc5696b8f779d8/solr/test-framework/src/java/org/apache/solr/embedded/JettySolrRunner.java#L890)
|
|
solr/modules/jwt-auth/src/java/org/apache/solr/security/jwt/JWTAuthPlugin.java
|
[818](https://github.com/apache/solr/blob/a33ba6bb6cf2e46fb136f879a6bc5696b8f779d8/solr/modules/jwt-auth/src/java/org/apache/solr/security/jwt/JWTAuthPlugin.java#L818)
|
<p><a
href="https://lift.sonatype.com/results/github.com/apache/solr/01GQEZBSKB0V8KWDB2MGK5EH8N?t=FindSecBugs|XSS_SERVLET"
target="_blank">Visit the Lift Web Console</a> to find more details in your
report.</p></div></details>
---
<details><summary><b>âšī¸ Learn about @sonatype-lift commands</b></summary>
You can reply with the following commands. For example, reply with
***@sonatype-lift ignoreall*** to leave out all findings.
| **Command** | **Usage** |
| ------------- | ------------- |
| `@sonatype-lift ignore` | Leave out the above finding from this PR |
| `@sonatype-lift ignoreall` | Leave out all the existing findings from this
PR |
| `@sonatype-lift exclude <file\|issue\|path\|tool>` | Exclude specified
`file\|issue\|path\|tool` from Lift findings by updating your config.toml file |
**Note:** When talking to LiftBot, you need to **refresh** the page to see
its response.
<sub>[Click here](https://github.com/apps/sonatype-lift/installations/new)
to add LiftBot to another repo.</sub></details>
---
Was this a good recommendation?
[ [đ Not
relevant](https://www.sonatype.com/lift-comment-rating?comment=371756073&lift_comment_rating=1)
] - [ [đ Won't
fix](https://www.sonatype.com/lift-comment-rating?comment=371756073&lift_comment_rating=2)
] - [ [đ Not critical, will
fix](https://www.sonatype.com/lift-comment-rating?comment=371756073&lift_comment_rating=3)
] - [ [đ Critical, will
fix](https://www.sonatype.com/lift-comment-rating?comment=371756073&lift_comment_rating=4)
] - [ [đ Critical, fixing
now](https://www.sonatype.com/lift-comment-rating?comment=371756073&lift_comment_rating=5)
]
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: [email protected]
For queries about this service, please contact Infrastructure at:
[email protected]
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]