Skip to content

Commit cf77c77

Browse files
[FAB-11857] ValidateCodePackage to java platform
Adding ValidateCodePackage to java platform unit tests Change-Id: I252df2d6c3b9f9cdc67fb493648cd6187eadc41d Signed-off-by: gennady <gennady@il.ibm.com>
1 parent b351c03 commit cf77c77

File tree

2 files changed

+98
-1
lines changed

2 files changed

+98
-1
lines changed

core/chaincode/platforms/java/java_test.go

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import (
1414
"os"
1515
"strings"
1616
"testing"
17+
"time"
1718

1819
"github.com/hyperledger/fabric/core/chaincode/platforms"
1920
"github.com/hyperledger/fabric/core/chaincode/platforms/java"
@@ -44,6 +45,36 @@ func TestValidatePath(t *testing.T) {
4445
assert.NoError(t, err)
4546
}
4647

48+
func TestValidateCodePackage(t *testing.T) {
49+
platform := java.Platform{}
50+
b, _ := generateMockPackegeBytes("src/pom.xml", 0100400)
51+
assert.NoError(t, platform.ValidateCodePackage(b))
52+
53+
b, _ = generateMockPackegeBytes("src/pom.xml", 0100555)
54+
assert.Error(t, platform.ValidateCodePackage(b))
55+
56+
b, _ = generateMockPackegeBytes("src/build.gradle", 0100400)
57+
assert.NoError(t, platform.ValidateCodePackage(b))
58+
59+
b, _ = generateMockPackegeBytes("src/build.xml", 0100400)
60+
assert.Error(t, platform.ValidateCodePackage(b))
61+
62+
b, _ = generateMockPackegeBytes("src/src/Main.java", 0100400)
63+
assert.NoError(t, platform.ValidateCodePackage(b))
64+
65+
b, _ = generateMockPackegeBytes("src/build/Main.java", 0100400)
66+
assert.Error(t, platform.ValidateCodePackage(b))
67+
68+
b, _ = generateMockPackegeBytes("src/src/xyz/main.java", 0100400)
69+
assert.NoError(t, platform.ValidateCodePackage(b))
70+
71+
b, _ = generateMockPackegeBytes("src/src/xyz/main.class", 0100400)
72+
assert.Error(t, platform.ValidateCodePackage(b))
73+
74+
b, _ = platform.GetDeploymentPayload(chaincodePathFolderGradle)
75+
assert.NoError(t, platform.ValidateCodePackage(b))
76+
}
77+
4778
func TestGetDeploymentPayload(t *testing.T) {
4879
platform := java.Platform{}
4980

@@ -161,3 +192,22 @@ func TestMain(m *testing.M) {
161192
}
162193
os.Exit(m.Run())
163194
}
195+
196+
func generateMockPackegeBytes(fileName string, mode int64) ([]byte, error) {
197+
var zeroTime time.Time
198+
codePackage := bytes.NewBuffer(nil)
199+
gw := gzip.NewWriter(codePackage)
200+
tw := tar.NewWriter(gw)
201+
payload := make([]byte, 25, 25)
202+
err := tw.WriteHeader(&tar.Header{Name: fileName, Size: int64(len(payload)), ModTime: zeroTime, AccessTime: zeroTime, ChangeTime: zeroTime, Mode: mode})
203+
if err != nil {
204+
return nil, err
205+
}
206+
_, err = tw.Write(payload)
207+
if err != nil {
208+
return nil, err
209+
}
210+
tw.Close()
211+
gw.Close()
212+
return codePackage.Bytes(), nil
213+
}

core/chaincode/platforms/java/platform.go

Lines changed: 48 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,9 @@ import (
1111
"compress/gzip"
1212
"errors"
1313
"fmt"
14+
"io"
1415
"net/url"
16+
"regexp"
1517
"strings"
1618

1719
"github.com/hyperledger/fabric/common/flogging"
@@ -45,7 +47,52 @@ func (javaPlatform *Platform) ValidatePath(rawPath string) error {
4547
}
4648

4749
func (javaPlatform *Platform) ValidateCodePackage(code []byte) error {
48-
// FIXME: Java platform needs to implement its own validation similar to GOLANG
50+
if len(code) == 0 {
51+
// Nothing to validate if no CodePackage was included
52+
return nil
53+
}
54+
55+
// File to be valid should match first RegExp and not match second one.
56+
filesToMatch := regexp.MustCompile(`^(/)?src/((src|META-INF)/.*|(build\.gradle|settings\.gradle|pom\.xml))`)
57+
filesToIgnore := regexp.MustCompile(`.*\.class$`)
58+
is := bytes.NewReader(code)
59+
gr, err := gzip.NewReader(is)
60+
if err != nil {
61+
return fmt.Errorf("failure opening codepackage gzip stream: %s", err)
62+
}
63+
tr := tar.NewReader(gr)
64+
65+
for {
66+
header, err := tr.Next()
67+
if err != nil {
68+
if err == io.EOF {
69+
// We only get here if there are no more entries to scan
70+
break
71+
} else {
72+
return err
73+
}
74+
}
75+
76+
// --------------------------------------------------------------------------------------
77+
// Check name for conforming path
78+
// --------------------------------------------------------------------------------------
79+
if !filesToMatch.MatchString(header.Name) || filesToIgnore.MatchString(header.Name) {
80+
return fmt.Errorf("illegal file detected in payload: \"%s\"", header.Name)
81+
}
82+
83+
// --------------------------------------------------------------------------------------
84+
// Check that file mode makes sense
85+
// --------------------------------------------------------------------------------------
86+
// Acceptable flags:
87+
// ISREG == 0100000
88+
// -rw-rw-rw- == 0666
89+
//
90+
// Anything else is suspect in this context and will be rejected
91+
// --------------------------------------------------------------------------------------
92+
if header.Mode&^0100666 != 0 {
93+
return fmt.Errorf("illegal file mode detected for file %s: %o", header.Name, header.Mode)
94+
}
95+
}
4996
return nil
5097
}
5198

0 commit comments

Comments
 (0)