Skip to content

Commit

Permalink
23.1 release (#1698)
Browse files Browse the repository at this point in the history
* Update spring boot version to fix CVE-2022-22965

* EPMRPP-76845 || Update spring boot

* Update Jenkinsfile

* EPMRPP-77678 || Description length increased to 2048

* EPMRPP-77678 || Redundant import fix

* EPMRPP-79737 || Fix vulnerabilities and update libraries version (#1624)

* EPMRPP-79136 || Add retrieving all logs with it's locations (#1619)

* EPMRPP-79136 || Add retrieving all logs with it's locations

* EPMRPP-79136 || Add filtering by log level and item type

* EPMRPP-79136 || Change response to save correct ordering

* EPMRPP-79136 || Fix exclude passed logs parameter

* EPMRPP-79136 || Override page size limit

* EPMRPP-79136 || Fix retrieving with passed logs exclusion

* Update Jenkinsfile-candidate

* EPMRPP-79136 || Update dao version

* EPMRPP-80383 || Notifications. AND/OR attribute option

* EPMRPP-80744 || Change email on the API page

* EPMRPP-80601 || Timeline widget. Remove empty content

* EPMRPP-80744 || Add item attribute max length validation (#1640)

EPMRPP-80744 || Add item attribute max length validation

* EPMRPP-81136 || Incorrect 'startTime' value is reported for tests via 'Import' functionality

Co-authored-by: Andrei Piankouski <andrei_piankouski@epam.com>

* EPMRPP-81046 || Impossible to report test items to project with "demo" name

* EPMRPP-81019 || Launch import. Error 'org.hibernate.exception.DataException: could not execute statement' occurs on importing launch (#1645)

* EPMRPP-81052 || Most failed test-cases table (TOP-20). Increase the amount of items to be displayed on widget from 20 to 50 or 100

* EPMRPP-80606 || Cut notification attribute to max length (#1650)

EPMRPP-80606 || Cut attributes to max length

* EPMRPP-81029 || There is no validation for the creation of dashboards exceeding the limit (#1651)

* Revert "EPMRPP-81029 || There is no validation for the creation of dashboards exceeding the limit (#1651)"

This reverts commit 13a49a6.

* EPMRPP-81029 || There is no validation for the creation of dashboards exceeding the limit

* EPMRPP-80606 || Update filter attribute cut logic (#1652)

* EPMRPP-78741 || Remove duplicate onboarding endpoint (#1653)

* EPMRPP-80606 || UserFilter cut attribute refactor (#1655)

* EPMRPP-81358 || Fix vulnerabilities

* EPMRPP-81193 || Wrong error code and message when creating notification rule without mandatory field

* EPMRPP-81202 || Widget 'Flaky test cases table (TOP-50). It is possible to create widget with invalid 'Launches count' value via API (#1670)

* EPMRPP-81202 || Widget 'Flaky test cases table (TOP-50). It is possible to create widget with invalid 'Launches count' value via API

* EPMRPP-81202 || Change migration brunch

* EPMRPP-81202 || Replace tab to spaces

---------

Co-authored-by: Andrei Piankouski <andrei_piankouski@epam.com>

* EPMRPP-82300 || Typo in the error message when creating 'Flaky test cases table (TOP-50)' widget with some invalid values via API (#1674)

* EPMRPP-82300-fix-typo-error uploaded commons-model dependency and fixed tests in service-api

* EPMRPP-82300-fix-typo-error fixed tests in service-api

* Epmrpp 78258 move acl (#1667)

* EPMRPP-81233 || Move ACL tasks from RP-23.3 to RP-23.1

* EPMRPP-72320 || Fix unit tests

* EPMRPP-81233 || Move ACL tasks from RP-23.3 to RP-23.1

* EPMRPP-81233 || Update bom

---------

Co-authored-by: Pavel Bortnik <pavel_bortnik@epam.com>
Co-authored-by: Andrei Piankouski <andrei_piankouski@epam.com>

* EPMRPP-81050 || Most Failed test-cases table widget. Increase the amount of items to be displayed on widget from 20 to 50

* EPMRPP-82116 || Update Notification template after launch finish (#1673)

* EPMRPP-82116 Updated template for Notifications after launch finish

* EPMRPP-82116 edited invitation templates

* Update common model

* EPMRPP-81362 || Fix security vulnerabilities (#1671)

* EPMRPP-82116 || Update Notification template after launch finish (removed attachments) (#1678)

* EPMRPP-82116-remove-attachments removed vk and fb attachments from specific email notifications

* EPMRPP-82116-remove-attachments removed vk and fb links from all templates

* EPMRPP-81154 added xml to api description and added file size check (#1677)

* EPMRPP-81970 || Autocomplete in Recipients filed on Notifications tab in Project settings should show options starting from 1 symbol (#1681)

* EPMRPP-81970 changed symbol limit from 3 to 1

* EPMRPP-81970 added code formatting

* EPMRPP-82375 || Implement notification when changing password and make some template updates (#1682)

* EPMRPP-82375 added a trigger to send a password change email

* EPMRPP-82375 updated YouTube links and footer text

* EPMRPP-82375 fixed test

* EPMRPP-82375 minor change in index template (#1683)

* EPMRPP-82545 || Update validation for Widgets (#1694)

* EPMRPP-82545 Updated validation for Widgets

* EPMRPP-82545 changed indent

* Update commons dao

* Master merge to 5.7.5 (#1695)

* EPMRPP-79211 || Changed Minio interface to JCloud

* EPMRPP-79211 || Updated DataStore configuration and properties

* EPMRPP-79211 || Updated docker-compose with right BinaryStore value

* EPMRPP-79211 || Update commons dao version

* Update commons dao dependency to 5.7.4

* EPMRPP-80865|| Update bom and other versions (#1663)

5.7.4 || Update bom and other versions

* [Gradle Release Plugin] - new version commit:  '5.7.5'.

---------

Co-authored-by: miracle8484 <76156909+miracle8484@users.noreply.github.com>
Co-authored-by: reportportal.io <support@reportportal.io>

* EPMRPP-83030 || Create RC branch

* Update version

* EPMRPP-83239 || Impossible to change password without Email Server integration

* EPMRPP-83239 || Impossible to change password without Email Server integration
---------

Co-authored-by: Andrei Piankouski <andrei_piankouski@epam.com>

* EPMRPP-78998 || Update dao

---------

Co-authored-by: Maksim Antonov <Maksim_Antonov@epam.com>
Co-authored-by: Ivan_Budayeu <Skileton2018>
Co-authored-by: miracle8484 <76156909+miracle8484@users.noreply.github.com>
Co-authored-by: Pavel Bortnik <pavel_bortnik@epam.com>
Co-authored-by: Ivan_Kustau <Ivan_Kustau@epam.com>
Co-authored-by: Ivan Kustau <86599591+IvanKustau@users.noreply.github.com>
Co-authored-by: Andrei Piankouski <andrei_piankouski@epam.com>
Co-authored-by: rkukharenka <125865748+rkukharenka@users.noreply.github.com>
Co-authored-by: reportportal.io <support@reportportal.io>
  • Loading branch information
9 people authored May 11, 2023
1 parent a9f21ec commit 048e260
Show file tree
Hide file tree
Showing 128 changed files with 1,194 additions and 2,077 deletions.
11 changes: 6 additions & 5 deletions Dockerfile
Original file line number Diff line number Diff line change
@@ -1,9 +1,10 @@
FROM alpine:latest
LABEL version=5.7.4 description="EPAM Report portal. Main API Service" maintainer="Andrei Varabyeu <andrei_varabyeu@epam.com>, Hleb Kanonik <hleb_kanonik@epam.com>"
FROM amazoncorretto:11.0.17
LABEL version=5.8.0 description="EPAM Report portal. Main API Service" maintainer="Andrei Varabyeu <andrei_varabyeu@epam.com>, Hleb Kanonik <hleb_kanonik@epam.com>"
ARG GH_TOKEN
RUN apk -U -q upgrade && apk --no-cache -q add fontconfig font-noto openjdk11 ca-certificates && \
echo 'exec java ${JAVA_OPTS} -jar service-api-5.7.4-exec.jar' > /start.sh && chmod +x /start.sh && \
wget --header="Authorization: Bearer ${GH_TOKEN}" -q https://maven.pkg.github.com/reportportal/service-api/com/epam/reportportal/service-api/5.7.4/service-api-5.7.4-exec.jar
ARG GH_URL=https://__:$GH_TOKEN@maven.pkg.github.com/reportportal/service-api/com/epam/reportportal/service-api/5.7.4/service-api-5.7.4-exec.jar
RUN curl -O -L $GH_URL \
--output service-api-5.8.0-exec.jar && \
echo 'exec java ${JAVA_OPTS} -jar service-api-5.8.0-exec.jar' > /start.sh && chmod +x /start.sh
ENV JAVA_OPTS="-Xmx1g -XX:+UseG1GC -XX:InitiatingHeapOccupancyPercent=70 -Djava.security.egd=file:/dev/./urandom"
VOLUME ["/tmp"]
EXPOSE 8080
Expand Down
27 changes: 17 additions & 10 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,7 @@ ext['spring-boot.version'] = '2.5.12'

dependencyManagement {
imports {
mavenBom(releaseMode ? 'com.epam.reportportal:commons-bom:' + getProperty('bom.version') : 'com.github.reportportal:commons-bom:f0b6bb6b')
mavenBom(releaseMode ? 'com.epam.reportportal:commons-bom:' + getProperty('bom.version') : 'com.github.reportportal:commons-bom:c34166e')
}
}

Expand All @@ -81,9 +81,9 @@ dependencies {
compile 'com.epam.reportportal:commons-fonts'
compile 'com.epam.reportportal:plugin-api'
} else {
compile 'com.github.reportportal:commons-dao:bf7f4474d7'
compile 'com.github.reportportal:commons-dao:43d03cd'
compile 'com.github.reportportal:commons-rules:5.3.0'
compile 'com.github.reportportal:commons-model:a0479c55'
compile 'com.github.reportportal:commons-model:a046458'
compile 'com.github.reportportal:commons:7480d61'
compile 'com.github.reportportal:commons-fonts:10d1054'
compile 'com.github.reportportal:plugin-api:886ac55'
Expand All @@ -100,12 +100,10 @@ dependencies {

compile group: 'com.opencsv', name: 'opencsv', version: '5.7.1'

//https://nvd.nist.gov/vuln/detail/CVE-2020-11996 AND https://nvd.nist.gov/vuln/detail/CVE-2020-9484
//AND https://nvd.nist.gov/vuln/detail/CVE-2020-13934 AND https://nvd.nist.gov/vuln/detail/CVE-2020-13935
//AND https://nvd.nist.gov/vuln/detail/CVE-2020-8022
compile 'org.apache.tomcat.embed:tomcat-embed-core:9.0.43'
compile 'org.apache.tomcat.embed:tomcat-embed-el:9.0.43'
compile 'org.apache.tomcat.embed:tomcat-embed-websocket:9.0.43'
// Fix CVE-2021-41079, CVE-2022-23181, CVE-2021-33037, CVE-2021-30640, CVE-2022-42252
compile 'org.apache.tomcat.embed:tomcat-embed-core:9.0.68'
compile 'org.apache.tomcat.embed:tomcat-embed-el:9.0.68'
compile 'org.apache.tomcat.embed:tomcat-embed-websocket:9.0.68'
//

//https://nvd.nist.gov/vuln/detail/CVE-2020-5411
Expand All @@ -130,11 +128,20 @@ dependencies {
compile 'org.springframework.security:spring-security-web:5.5.8'
//

compile 'org.springframework.security.oauth:spring-security-oauth2:2.4.0.RELEASE'
// Fix CVE-2022-22969
compile 'org.springframework.security.oauth:spring-security-oauth2:2.5.2.RELEASE'
compile 'org.springframework.security:spring-security-jwt:1.0.11.RELEASE'
compile 'org.springframework.security:spring-security-acl'
compile 'com.github.ben-manes.caffeine:caffeine:2.8.0'

// Fix CVE-2022-22965, CVE-2022-22970
compile 'org.springframework:spring-beans:5.3.20'
// Fix CVE-2021-22060, CVE-2021-22096
compile 'org.springframework:spring-core:5.3.20'
// Fix CVE-2022-45685, CVE-2022-40150, CVE-2022-40149
compile 'org.codehaus.jettison:jettison:1.5.2'
// Fix CVE-2020-15522
compile 'org.bouncycastle:bcprov-jdk15on:1.69'
compile 'org.apache.commons:commons-compress:1.21'
compile 'org.yaml:snakeyaml:1.32'
compile 'org.hibernate:hibernate-core:5.4.24.Final'
Expand Down
4 changes: 2 additions & 2 deletions gradle.properties
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
version=5.7.5
version=5.8.0
description=EPAM Report portal. Main API Service
dockerPrepareEnvironment=apk -U -q upgrade && apk --no-cache -q add fontconfig font-noto openjdk11 ca-certificates
dockerPrepareEnvironment=
dockerJavaOpts=-Xmx1g -XX:+UseG1GC -XX:InitiatingHeapOccupancyPercent=70 -Djava.security.egd=file:/dev/./urandom
dockerJavaOptsDev=-DLOG_FILE=app.log \
-Xmx1g \
Expand Down
7 changes: 5 additions & 2 deletions project-properties.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -17,8 +17,8 @@ project.ext {
]
isDebugMode = System.getProperty("DEBUG", "false") == "true"
releaseMode = project.hasProperty("releaseMode")
scriptsUrl = commonScriptsUrl + (releaseMode ? getProperty('scripts.version') : 'develop')
migrationsUrl = migrationsScriptsUrl + (releaseMode ? getProperty('migrations.version') : 'develop')
scriptsUrl = commonScriptsUrl + (releaseMode ? getProperty('scripts.version') : 'EPMRPP-81358-fix-vulnerabilities')
migrationsUrl = migrationsScriptsUrl + (releaseMode ? getProperty('migrations.version') : 'hotfix/5.8.0')
//TODO refactor with archive download
testScriptsSrc = [
(migrationsUrl + '/migrations/0_extensions.up.sql') : 'V001__extensions.sql',
Expand Down Expand Up @@ -56,6 +56,9 @@ project.ext {
(migrationsUrl + '/migrations/54_analyzer_unique_error_attribute.up.sql') : 'V054__analyzer_unique_error_attribute.sql',
(migrationsUrl + '/migrations/58_alter_ticket.up.sql') : 'V058__alter_ticket.sql',
(migrationsUrl + '/migrations/59_stale_materialized_view.up.sql') : 'V059__stale_materialized_view.sql',
(migrationsUrl + '/migrations/60_sender_case_operator.up.sql') : 'V060__sender_case_operator.sql',
(migrationsUrl + '/migrations/61_remove_acl.up.sql') : 'V061__remove_acl.sql',
(migrationsUrl + '/migrations/62_remove_dashboard_cascade_drop.up.sql') : 'V062_remove_dashboard_cascade_drop.sql',
]
excludeTests = ['**/entity/**',
'**/aop/**',
Expand Down
Original file line number Diff line number Diff line change
@@ -1,159 +0,0 @@
/*
* Copyright 2019 EPAM Systems
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.epam.ta.reportportal.auth.acl;

import org.springframework.security.acls.domain.ObjectIdentityImpl;
import org.springframework.security.acls.domain.PrincipalSid;
import org.springframework.security.acls.jdbc.JdbcMutableAclService;
import org.springframework.security.acls.jdbc.LookupStrategy;
import org.springframework.security.acls.model.AccessControlEntry;
import org.springframework.security.acls.model.AclCache;
import org.springframework.security.acls.model.MutableAcl;
import org.springframework.security.acls.model.Permission;

import javax.sql.DataSource;
import java.util.List;
import java.util.Optional;

/**
* @author Ivan Nikitsenka
*/
public class ReportPortalAclService extends JdbcMutableAclService {

private static final String IDENTITY_QUERY = "select currval(pg_get_serial_sequence('acl_class', 'id'))";
private static final String SID_IDENTITY_QUERY = "select currval(pg_get_serial_sequence('acl_sid', 'id'))";
private static final String OBJECT_IDENTITY_PRIMARY_KEY_QUERY =
"select acl_object_identity.id\n" + "from acl_object_identity,\n" + " acl_class\n"
+ "where acl_object_identity.object_id_class = acl_class.id\n" + " and acl_class.class= ? \n"
+ " and acl_object_identity.object_id_identity = ? ::varchar";
private static final String FIND_CHILDREN_QUERY = "select obj.object_id_identity as obj_id, class.class as class"
+ " from acl_object_identity obj, acl_object_identity parent, acl_class class "
+ "where obj.parent_object = parent.id and obj.object_id_class = class.id "
+ "and parent.object_id_identity = ?::varchar and parent.object_id_class = ("
+ "select id FROM acl_class where acl_class.class = ?)";

public ReportPortalAclService(DataSource dataSource, LookupStrategy lookupStrategy, AclCache aclCache) {
super(dataSource, lookupStrategy, aclCache);
this.setClassIdentityQuery(IDENTITY_QUERY);
this.setSidIdentityQuery(SID_IDENTITY_QUERY);
this.setObjectIdentityPrimaryKeyQuery(OBJECT_IDENTITY_PRIMARY_KEY_QUERY);
this.setFindChildrenQuery(FIND_CHILDREN_QUERY);
this.setAclClassIdSupported(true);
}

/**
* Creates new ACL with current user as owner.
*
* @param object to add acl.
* @return {@link MutableAcl}
*/
Optional<MutableAcl> createAcl(Object object) {
Optional<MutableAcl> acl = getAcl(object);
if (acl.isPresent()) {
return acl;
}
return Optional.of(createAcl(new ObjectIdentityImpl(object)));
}

/**
* Deletes ACL of provided object.
*
* @param object to remove acl.
*/
void deleteAcl(Object object) {
Optional<MutableAcl> acl = getAcl(object);
if (acl.isPresent()) {
deleteAcl(new ObjectIdentityImpl(object), true);
}
}

/**
* Add read permissions to the object for the user.
*
* @param object to add permission settings.
* @param userName this user will be allowed to read the object.
* @param permission permission
* @return {@link MutableAcl}
*/
Optional<MutableAcl> addPermissions(Object object, String userName, Permission permission) {
Optional<MutableAcl> acl = getAcl(object);
if (!acl.isPresent() || isAceExistForUser(acl.get(), userName)) {
return acl;
}
PrincipalSid sid = new PrincipalSid(userName);
acl.get().insertAce(0, permission, sid, true);
updateAcl(acl.get());
return acl;
}

/**
* Remove read permissions to the object for the user.
*
* @param object to remove permission settings.
* @param userName this user will not be allowed to read the object.
* @return {@link MutableAcl}
*/
Optional<MutableAcl> removePermissions(Object object, String userName) {
Optional<MutableAcl> acl = getAcl(object);
if (acl.isPresent() && isAceExistForUser(acl.get(), userName)) {
PrincipalSid sid = new PrincipalSid(userName);
if (!acl.get().getOwner().equals(sid)) {
for (int i = 0; i < acl.get().getEntries().size(); i++) {
AccessControlEntry entry = acl.get().getEntries().get(i);
if (sid.equals(entry.getSid())) {
acl.get().deleteAce(i);
break;
}
}
updateAcl(acl.get());
return acl;
}
}
return acl;
}

/**
* Returns true if the user has any permission for the object.
*
* @param acl Acl
* @param userName User
* @return boolean
*/
private boolean isAceExistForUser(MutableAcl acl, String userName) {
PrincipalSid sid = new PrincipalSid(userName);
List<AccessControlEntry> entries = acl.getEntries();
for (AccessControlEntry ace : entries) {
if (ace != null && sid.equals(ace.getSid())) {
return true;
}
}
return false;
}

/**
* Returns existed ACL for object.
*
* @param object Object
* @return {@link MutableAcl}
*/
Optional<MutableAcl> getAcl(Object object) {
ObjectIdentityImpl objectIdentity = new ObjectIdentityImpl(object);
if (retrieveObjectIdentityPrimaryKey(objectIdentity) != null) {
return Optional.of((MutableAcl) readAclById(objectIdentity));
}
return Optional.empty();
}
}
Original file line number Diff line number Diff line change
@@ -1,128 +0,0 @@
/*
* Copyright 2019 EPAM Systems
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

package com.epam.ta.reportportal.auth.acl;

import com.epam.ta.reportportal.dao.ShareableEntityRepository;
import com.epam.ta.reportportal.dao.UserRepository;
import com.epam.ta.reportportal.entity.ShareableEntity;
import com.epam.ta.reportportal.entity.project.ProjectRole;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.acls.domain.BasePermission;
import org.springframework.security.acls.model.Permission;
import org.springframework.stereotype.Service;

import java.util.List;

/**
* @author <a href="mailto:pavel_bortnik@epam.com">Pavel Bortnik</a>
*/
@Service
public class ShareableObjectsHandler {

@Autowired
private ReportPortalAclService aclService;

@Autowired
private UserRepository userRepository;

@Autowired
private ShareableEntityRepository shareableEntityRepository;

/**
* Initialize acl for sharable object. Give {@link BasePermission#ADMINISTRATION}
* permissions to owner. If object is shared, give {@link BasePermission#READ}
* permissions to users assigned to project.
*
* @param object Object for acl
* @param owner Owner of object
* @param projectId Project id
* @param isShared Shared or not
*/
public void initAcl(Object object, String owner, Long projectId, boolean isShared) {
aclService.createAcl(object);
aclService.addPermissions(object, owner, BasePermission.ADMINISTRATION);
if (isShared) {
userRepository.findUsernamesWithProjectRolesByProjectId(projectId)
.entrySet()
.stream()
.filter(entry -> !entry.getKey().equalsIgnoreCase(owner))
.forEach(entry -> {
if (entry.getValue().sameOrHigherThan(ProjectRole.PROJECT_MANAGER)) {
aclService.addPermissions(object, entry.getKey(), BasePermission.ADMINISTRATION);
} else {
aclService.addPermissions(object, entry.getKey(), BasePermission.READ);
}

});
}
}

/**
* Update acl for sharable object. If object is shared, give {@link BasePermission#READ}
* permissions to users assigned to project.
*
* @param object Object for acl
* @param projectId Project id
* @param isShared Shared or not
*/
public void updateAcl(Object object, Long projectId, boolean isShared) {
if (isShared) {
userRepository.findUsernamesWithProjectRolesByProjectId(projectId).forEach((username, projectRole) -> {
if (projectRole.sameOrHigherThan(ProjectRole.PROJECT_MANAGER)) {
aclService.addPermissions(object, username, BasePermission.ADMINISTRATION);
} else {
aclService.addPermissions(object, username, BasePermission.READ);
}

});
} else {
userRepository.findNamesByProject(projectId).forEach(login -> aclService.removePermissions(object, login));
}
}

/**
* Prevent shared objects for concrete user
*
* @param projectId Project
* @param userName Username
*/
public void preventSharedObjects(Long projectId, String userName) {
List<ShareableEntity> sharedEntities = shareableEntityRepository.findAllByProjectIdAndShared(projectId, true);
sharedEntities.forEach(entity -> aclService.removePermissions(entity, userName));
}

/**
* Permit shared objects for concrete user
*
* @param projectId Project
* @param userName Username
*/
public void permitSharedObjects(Long projectId, String userName, Permission permission) {
List<ShareableEntity> shareableEntities = shareableEntityRepository.findAllByProjectIdAndShared(projectId, true);
shareableEntities.forEach(entity -> aclService.addPermissions(entity, userName, permission));
}

/**
* Remove ACL for object.
*
* @param object Object to be removed
*/
public void deleteAclForObject(Object object) {
aclService.deleteAcl(object);
}

}
Loading

0 comments on commit 048e260

Please sign in to comment.