From 9422182dec0470c5402e3186c93589d3740f147d Mon Sep 17 00:00:00 2001 From: GME Date: Mon, 22 Oct 2018 18:29:26 +0200 Subject: [PATCH] Register and Enroll User with Test Success to register and Enroll User using default Admin --- msp/Org1/UserJavaTest.context | Bin 0 -> 1870 bytes msp/Org1MSP/admin.context | Bin 0 -> 1700 bytes .../blockchain/client/CAClientWrapper.java | 36 ++++++++++++++++++ .../client/FabricClientWrapper.java | 11 ++++++ .../java/blockchain/configuration/Config.java | 8 ++-- .../client/TestRegisterEnrollUser.java | 36 ++++++++++++++++++ src/test/java/blockchain/query/QueryTest.java | 31 +++++++++++++++ .../blockchain/client/CAClientWrapper.class | Bin 3569 -> 5201 bytes .../client/FabricClientWrapper.class | Bin 2151 -> 2976 bytes .../blockchain/configuration/Config.class | Bin 886 -> 886 bytes .../blockchain/client/TestEnrollAdmin.class | Bin 2371 -> 2371 bytes .../client/TestRegisterEnrollUser.class | Bin 0 -> 2378 bytes .../blockchain/query/QueryTest.class | Bin 0 -> 1784 bytes 13 files changed, 119 insertions(+), 3 deletions(-) create mode 100644 msp/Org1/UserJavaTest.context create mode 100644 msp/Org1MSP/admin.context create mode 100644 src/test/java/blockchain/client/TestRegisterEnrollUser.java create mode 100644 src/test/java/blockchain/query/QueryTest.java create mode 100644 target/test-classes/blockchain/client/TestRegisterEnrollUser.class create mode 100644 target/test-classes/blockchain/query/QueryTest.class diff --git a/msp/Org1/UserJavaTest.context b/msp/Org1/UserJavaTest.context new file mode 100644 index 0000000000000000000000000000000000000000..763a487596ace7b4e5cdb797d3e0af3cdcceefca GIT binary patch literal 1870 zcmb_dO^n+_81-hiyREyZrB$gY60{Nm!ImVOO}4v~QpWZqb`m>r)=4%gh&s08*s){B zKe3$(q+WX9fDo17*j9^F2~{c=4jg*ui9^*rpkARpR2+%`Aue!1jI+C4R5&2SNFI;A zdGo!Qr}^I8_z~OVI@og^!;<<^Pt*oU-&LGs9d)EN@RZQQw%Swzn=NB=q9j@V!1J&} zWnCPJDMK8nsWs2h2I}cDwqNXaHA53U%^D1`_pzxmhARWdG7M9R7rk7z95vO8Y{fAY zSyh}=SL`^Nlyc>M3O)v+OnXe%X5{T0GXv37w#R!=HpTU@16%yQrx~d=#XB9^wujB2 z^o!^`C(%Fo7nxxsCAmvlq3i2`o{@W+cV&wyCE3O5|Zjw}@Ot z@*T~KQY9s-ikgE6z3B_D#f^XkhC5Een!w~45(sb-#aV_S+X6`fHBv#q5I|+>oa|>8 zl_9w%M0$(%Tir#z&n+9Ze1#84wZ)XIHZ#`K5a9z{q+po^{Q_95L!!r$jRqU$$Dl!| zTmxkjsD5rF4Qdtxxt?UMx?(feV{3c>)fUy@`4SETk5SeMLo!37U62h)hgBA&Cke@r zE!51sCYgrL*7`v{m@J}TNSLi=F%p}shqp4&lQNA+HX9L3WY;MHW?2D5tPV5i3)s9B z$8x)|RvZgB0ZK6u9&bHnYGp#Z-OQy~;O?-)&Qfu}3b4Tv>?8(4mTjzahSaxvvYD^9 z*SR##=KBE*TJ*LsB;X&5L;+r+cojglp5=9aZM4#+>M0kRjGS9`q97&F@+v;=k2oqr z^zCps$Pw#i6xLO^Sj$u@3u}WQDu_PtZ@YiXSz)F5wxdShG{%-Vu1lfcSyg2Q#WQ)G3hE%e<0Zw2VgDhmm|MWc%g z8%wU%TCb(00jpI8t|k^*KHqGcVl%W+-0ozuT16|4BvT3*Ezs~7P;2I*P9}6a&4w>S z12Vd$J*jpKj#7z>?RG0S*?*a~zyB#V`t zvsACP{Vq3LZI_8`X;~`sXYffWL5})+d7&~t5?fGmr!teoI0XkL%BOxsah7r7?dhiIr4 za+;nwv7yk$JS+i8-@y{+h#S8i{cU!y@F0OO=?=HGV zO%vG6B6sk^hc|!u=-wZF$B^^7UiaA0GMs&XMDXh0)5-A77cj zq(4Xo7ryvm|1-BX-nx3b@zn#44UtH1{1=gSbUtxq{K3W}`o({(QLNQLKklDKvYbn| f{!x&V+U0AFOkz$1lVx=w=DuRfMF1pc$AT6lXO;KFvMy#8vsae*V{Y z&d2}#mu@1{u7f<nA zHU82wF%tF{By0oec~QV(FsxK0z!u=_#qjszr_~E7B*h|AqU3m+Xp_1WdB~m(ELReJ zNA;piS&FKH>cp5{>YIbfffUVD_7PN_XNn8~cxvoLIfj9A8bN?AErWo8KxUe)mcQIx zvYUB>>N%AanqdRmRlNqy>H#5ln6lMn*0d}Y=Le`jQY;5_8swT3R5+s5;=q8S=px^IXYRpmf-+>i)4 zx^5O#(KIx!t_Q_nTtreKG&}93NN95&+QBJL#9L9{Y(*T*uaG>I=XeltJcU2$}W`~JwBTL{wCY|z#^B$POiPdMq50R=NbEn&YTlYmQzMoV=L zg24g>G!T2n9p)`qZ7cf5Qnotr;IusIzk?EIXmg+h6WBuOwxic1ZSLTM7TWmsRS z)R()ZLN3b?nw(p9a|?%DCOu;38f%~oWqG9N+H$p4BY|8g0TNO`g-kBTH_J}mJ? z-dfN#jVadq&EbN03>^gG5lQuKESB?j+wU2wI8J={-o!hhSWhwTu|&ANc*%&7D7c;>VVWptqJ-IwwW{{x z^|QMVE`5A_^3*GkeR1yvbgSqcauOm_ zXWqTNcm2m}-=1#}KYj7#>Bsj~PMkUX!AGBd|J1H+zdrlR=#BD~->~v0C)RJMf80>u z(F50&<5zmZTbJLzd~3&RUr&cINk{(+Nq2aD?CrI)7k@52@vk{bxO&h}?uTMpPG&p* TNXh^5x2+xSA=5(NREPGTjiETT literal 0 HcmV?d00001 diff --git a/src/main/java/blockchain/client/CAClientWrapper.java b/src/main/java/blockchain/client/CAClientWrapper.java index 5df0efb..fbfdd24 100644 --- a/src/main/java/blockchain/client/CAClientWrapper.java +++ b/src/main/java/blockchain/client/CAClientWrapper.java @@ -9,6 +9,7 @@ import org.hyperledger.fabric.sdk.exception.CryptoException; import org.hyperledger.fabric.sdk.exception.InvalidArgumentException; import org.hyperledger.fabric.sdk.security.CryptoSuite; import org.hyperledger.fabric_ca.sdk.HFCAClient; +import org.hyperledger.fabric_ca.sdk.RegistrationRequest; import java.lang.reflect.InvocationTargetException; import java.net.MalformedURLException; @@ -36,6 +37,7 @@ public class CAClientWrapper { } private void init() throws MalformedURLException, IllegalAccessException, InstantiationException, ClassNotFoundException, CryptoException, InvalidArgumentException, NoSuchMethodException, InvocationTargetException { + BasicConfigurator.configure(); CryptoSuite cryptoSuite = CryptoSuite.Factory.getCryptoSuite(); hfcaClient = HFCAClient.createNewInstance(caUrl, properties); hfcaClient.setCryptoSuite(cryptoSuite); @@ -65,5 +67,39 @@ public class CAClientWrapper { return adminContext; } + //Method to register an User + public String registerUser(String username, String organization) throws Exception { + UserContext userContext = Util.readUserContext(organization, username); + if (userContext!=null){ + logger.warn("User already registered"); + return null; + } + RegistrationRequest rr = new RegistrationRequest(username,organization); + logger.info("registrar is : "+adminContext.getName()); + String enrollementSecret = hfcaClient.register(rr,adminContext); + logger.info("User registered"); + return enrollementSecret; + } + + //Method to enroll an User + public UserContext enrollUser(UserContext userContext, String secret) throws Exception{ + UserContext uContext = Util.readUserContext(userContext.getAffiliation(),userContext.getName()); + if(uContext!=null){ + logger.warn("User already enrolled"); + return uContext; + } + Enrollment enrollment = hfcaClient.enroll(userContext.getName(),secret); + userContext.setEnrollment(enrollment); + Util.writeUserContext(userContext); + logger.info("User enrolled"); + return userContext; + } + + //Method to revoke an User + public void revokeUser(UserContext admin, Enrollment userEnrollement, String reason) throws Exception{ + hfcaClient.revoke(admin,userEnrollement,reason); + } + + } diff --git a/src/main/java/blockchain/client/FabricClientWrapper.java b/src/main/java/blockchain/client/FabricClientWrapper.java index eeb3ee9..5c7a13d 100644 --- a/src/main/java/blockchain/client/FabricClientWrapper.java +++ b/src/main/java/blockchain/client/FabricClientWrapper.java @@ -1,13 +1,17 @@ package blockchain.client; +import blockchain.configuration.Config; import blockchain.user.UserContext; import org.hyperledger.fabric.sdk.Channel; import org.hyperledger.fabric.sdk.HFClient; +import org.hyperledger.fabric.sdk.Peer; import org.hyperledger.fabric.sdk.exception.CryptoException; import org.hyperledger.fabric.sdk.exception.InvalidArgumentException; +import org.hyperledger.fabric.sdk.exception.ProposalException; import org.hyperledger.fabric.sdk.security.CryptoSuite; import java.lang.reflect.InvocationTargetException; +import java.util.Set; public class FabricClientWrapper { private HFClient client; @@ -28,4 +32,11 @@ public class FabricClientWrapper { ChannelClientWrapper channelClientWrapper = new ChannelClientWrapper(name, channel, this); return channelClientWrapper; } + + public Set queryForChannels() throws InvalidArgumentException, IllegalArgumentException, ProposalException { + client.newChannel(Config.CHANNEL_NAME); + client.newOrderer(Config.ORDERER_NAME,Config.ORDERER_URL); + Peer peer = client.newPeer(Config.ORG1_PEER_0,Config.ORG1_PEER_0_URL); + return client.queryChannels(peer); + } } diff --git a/src/main/java/blockchain/configuration/Config.java b/src/main/java/blockchain/configuration/Config.java index 0f0b9ee..bd1200b 100644 --- a/src/main/java/blockchain/configuration/Config.java +++ b/src/main/java/blockchain/configuration/Config.java @@ -4,7 +4,7 @@ public class Config { public static final String ORG1_MSP = "Org1MSP"; - public static final String ORG1 = "Org1"; + public static final String ORG1 = "org1"; public static final String ADMIN = "admin"; @@ -12,7 +12,7 @@ public class Config { public static final String CA_ORG1_URL = "http://vps577432.ovh.net:7054"; - public static final String ORDERER_URL = "http://vps577432.ovh.net:7050"; + public static final String ORDERER_URL = "grpc://vps577432.ovh.net:7050"; public static final String ORDERER_NAME = "orderer.example.com"; @@ -22,7 +22,9 @@ public class Config { public static final String ORG1_PEER_0 = "peer0.org1.example.com"; - public static final String ORG1_PEER_0_URL = "http://vps577432.ovh.net:7051"; + public static final String ORG1_PEER_0_URL = "grpc://vps577432.ovh.net:7051"; + + public static final String USER_TEST_SECRET = "frwcKfCYPxWA"; } diff --git a/src/test/java/blockchain/client/TestRegisterEnrollUser.java b/src/test/java/blockchain/client/TestRegisterEnrollUser.java new file mode 100644 index 0000000..45a6ae3 --- /dev/null +++ b/src/test/java/blockchain/client/TestRegisterEnrollUser.java @@ -0,0 +1,36 @@ +package blockchain.client; + +import blockchain.configuration.Config; +import blockchain.user.UserContext; +import blockchain.utility.Util; +import org.apache.log4j.Logger; +import org.junit.Test; + +public class TestRegisterEnrollUser { + private static Logger logger = Logger.getLogger(TestRegisterEnrollUser.class); + //Success + @Test + public void RegisterEnrollUser(){ + String caUrl = Config.CA_ORG1_URL; + try{ + CAClientWrapper caClientWrapper = new CAClientWrapper(caUrl,null); + UserContext admin = Util.readUserContext(Config.ORG1,Config.ADMIN); + caClientWrapper.setAdminContext(admin); + UserContext userContext = new UserContext(); + + userContext.setName("UserJavaTest"); + userContext.setAffiliation(Config.ORG1); + userContext.setMspId(Config.ORG1_MSP); + String userSecret = caClientWrapper.registerUser(userContext.getName(),userContext.getAffiliation()); + logger.info("uSecret : "+userSecret); + userContext = caClientWrapper.enrollUser(userContext,userSecret); + logger.info("userContext enrollement : "+userContext.getEnrollment()); + + }catch (Exception e){ + e.printStackTrace(); + } + + + } + +} diff --git a/src/test/java/blockchain/query/QueryTest.java b/src/test/java/blockchain/query/QueryTest.java new file mode 100644 index 0000000..2d6d74b --- /dev/null +++ b/src/test/java/blockchain/query/QueryTest.java @@ -0,0 +1,31 @@ +package blockchain.query; + +import blockchain.client.FabricClientWrapper; +import blockchain.configuration.Config; +import blockchain.user.UserContext; +import blockchain.utility.Util; +import org.apache.log4j.BasicConfigurator; +import org.apache.log4j.Logger; +import org.hyperledger.fabric.sdk.Peer; +import org.junit.Test; + +import java.util.Set; + +public class QueryTest { + private static Logger logger = Logger.getLogger(QueryTest.class); + //DON'T WORK + @Test + public void TestAQueryChannels() { + BasicConfigurator.configure(); + UserContext admin = Util.readUserContext(Config.ORG1,Config.ADMIN); + try{ + FabricClientWrapper fabricClientWrapper = new FabricClientWrapper(admin); + Set channels = fabricClientWrapper.queryForChannels(); + logger.info("Channels : "+channels); + }catch (Exception e){ + e.printStackTrace(); + } + + + } +} diff --git a/target/classes/blockchain/client/CAClientWrapper.class b/target/classes/blockchain/client/CAClientWrapper.class index 9edb4571625e5b6534dff9a3f0de8c162a354686..2a0e140fe9a117c36d604011feccd8bd58e168a4 100644 GIT binary patch literal 5201 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 delta 1111 zcmZ{i+jCP@6vlt&G|5g5o3@imhe-=GT%@Fy+ENM>ER>5N)+z!baxX2RPy!TCt3bG; zs9btf5Pb33r%uGl@WA-&n={V%=HGzND)Q|UE;=KV$y#e?t@W+-eJj5-|ItwV`Qg3$ zKqud($nd5!Zv`~6!9{O7voVm_6tJ0h0=Dq3Gg|}RV_U#>b_DEXSHN!e7zP5WE1i3j z3Fv*DPJ!D7~T=uZx$iz<>zy7FU)Nssj+;GD1zTpGIhouL8 zn-?21d=&l`Z{IM77cH}xZRw!LGJ_^dmYJ4U=rNqM6ggu!YdObx%LOhPE?F+S zv`4jt|I|+V-`WlqXz0A~`({vh z3#U_Ynj{P9ViAj3BHBw?ri^ay<|w~iC{BpRGNvz=`+=Cg@iNKcU3`Up%a5d<>66wf zNXM9ztP?;3xqoTZ_;{I^6kN^<(SF_v9=)urtl;@tAtBU!nV_|$%%pC&L-=d$u1JF} zCM(&hqBb47Lo7R`z(S4c(l1NItXojaST9x^HFlc@4+!3A)KdX|s!^U*(#>gF2b3pzLNo<`k(%8_JJU diff --git a/target/classes/blockchain/client/FabricClientWrapper.class b/target/classes/blockchain/client/FabricClientWrapper.class index d40738fa595be7e366ffa5186c3bf74589adb904..be8706591a746b70c3c1e47882404b209bfc6c35 100644 GIT binary patch delta 1156 zcma)4%Tg0T6g?dtoy0*PM4lofnh-!U;Ta`}JOl)zps1*zGK6LbOlHE6@L2H$Zp;r@ zet{NN7A|ya`3L@ht}Oq+^7e!(EGes8^zGYy&pr3~z2K<@B ztc0P?ve$$y?5Nn+GFd}JQ&xtdRkyRLAywVY?hM4^{e8VrYj-1Riri2< zHV{*gfyq!W>y1S%TknzH1OMsXqrgH|!8WK_p~B0`(9vw!BntbT>g^@T%;I?TZaagn$#k-Y{SA%xL^2s+V)ZbDqf6(`bH-f<`+ zopqSn;2{P-aY*(qiVG^Nl%3R~PEj6IA%-6E_tWV`ANk5SvivZeehko$Y{3@YF1ovA z3w&pa;ERr?_^OIHThgodd^JVXCZ(af2;WJkd`|ojyu?~h*#{|qnOA*@^Ej^{AJih_huih#E delta 489 zcmX|+%}x|S6otQ{2Wq-)m;JBVm0P7YccC=xWk|tqev)^tXzEV%Dv+M-aJnkl542HE>V_qR^PDZf<}UrxL$Rt(l+soW!;f_ JHQusBcn4o0Fwy`3 diff --git a/target/classes/blockchain/configuration/Config.class b/target/classes/blockchain/configuration/Config.class index 2a8480ff5ad1c1c5d468f72e0e7bf7d352818426..f99ed3ca73b3cc0677b61789cafc390618f78ec4 100644 GIT binary patch delta 32 lcmeyy_Kj`BZbruZ$$JsbXaJE5Hn-`W?|-8tda^0sSJt?EeuKwiy2fImN6(ZEN4(*Sk0h5`4~qn0QGYU Axc~qF delta 44 zcmX>sbXaJE5Hq9yW?|-8tdjB!sSFAXEewhbiy2fHmN6(XEN4(=Sk0g|`4~qn0PuVY Ak^lez diff --git a/target/test-classes/blockchain/client/TestRegisterEnrollUser.class b/target/test-classes/blockchain/client/TestRegisterEnrollUser.class new file mode 100644 index 0000000000000000000000000000000000000000..ddb4a8dc984d7d48dd540360d4f42851153f7838 GIT binary patch literal 2378 zcmai0Yj+b>6y3K;JLxc`CA5^5S1UeRC>>OPs$4sF1Exc8nj=bU@aKKtIAzyJC3F91{cUdM6FXt+oOH*L>#{K#B#>d`Hy;?^T4yy}O6=PlQrkQ-)qYq_6osM&6Sn)vO!_~XCQ;XcdmpyH3IrJ2I79-1Eo3&~!Fo?Vcn|&bMw;F!rt~)Dk z-6d8tz8^%EI1{SARx4H;#JmL&<7F-pvbYEOV$cX}=b9^sA8HTbq@-)$RlKHfEQx#I zm)%MuZ0%&SR!Rh>8b!67X>Qc&=clKq&YhhMHmZ}p6Xm8)pPy0~O-6`2w*zI_szhRt zLT5BM2Fj=ysKRB23Fn=lD;Uy(n@m>fFtCa>10L2Cw0VY_U0g7*E;=89ftn0oAT;nY zUQrm_*^?^`*DDDx^hVsck=%%ZIvBWtK*NTCFLBqvJ$$7woapw5(;}a;Ig@iWn0N=5#+o9%*tBy@xB~&r36i$vMD7DG8Sks7H&s+!t zQa^H?`b9a4gNYpEyBpmzmpSvagpO4bbhj9te{SR?ugCxAl=Rk}XhsgyR@{-X7rIEA z8lC2>bvZC?k`Rl%61H4s1ubrp@l?##Yd1(Mt@6~ne{6g=I&`MNGtNf1d8-Hj3K!aJ zx;swW&|PxX_)Owdn;5%2HYq44HVU4$bnrPhD-Vq8mxCRk#N23gSC4ra7cuu@nA_Ep zBnN@mao_b2wfNQ*-Ybj~T*9S&p%n>aYs z$)Sm%CWdJ#(xF^BVRKk)=zOG!qp{g<$jnYOG4hakrtkxP<0~1Gs=eT*pBaF~o~?nEpo@;V^!}5&S|R1&!;_=zkxRgsy{r5l+)L z#W-c0s?m%`7O=2spxYWJh#UvAN%;SCKrC=D0WxWo_A mfHyg3aCxg&qtwZ-J3IOqFa3dj=@+TUG47X6=`Bhfc>6yCJaqd2 literal 0 HcmV?d00001 diff --git a/target/test-classes/blockchain/query/QueryTest.class b/target/test-classes/blockchain/query/QueryTest.class new file mode 100644 index 0000000000000000000000000000000000000000..471931668681cc36dc65f6acea03567c85826225 GIT binary patch literal 1784 zcmah~>r&fB7(MG4WXlRBhTs6XkfbRlfhb8SZ84<*H}qym69Xx|jw}na#7M3zcfu3( zciI`lG&6mGK1H6S?ODktB5qQ9=3DKz-}RhtrN93E<4*wd_({hY=5@S}1q~mh@L>wm zIzGaphN2D)OGpBhk zjO04J3KSj`VAR0#cbVB+48>ii)FS0*)S`P$|zXy`AFNa z+`9STne8+K>A5@`uxba=6}S{n)owYyxkXX(+`xIJVvL<`_^{b)`ugc~OR+qaz?W{l zxJ>u6mB6x}u3OCzD)OS?E3!l~9=F{<9yr^wC5hyU>w1BuY9lDaAyNBnGGcbYODz$G zh#|e=wSC)JlZua_6NGQ8?hTA%LPOcWIwl0J#0arHcURWiewf5$gWQp5j>KIJ8wMWY zYk?bahd1J`vOF^I7!?C~ToA~I$cGq5y|1=qqo$b5^r)U%oHDS9EhV-MJi#{_b_{%r z?>Gdn+)pSn@V)9_B396ABW2(R{7A4~IX|rKJ9Z#28FPA_Qh{rIw_w$3aRg8B@mP1d z2NyBU$HQ^DWN>J1apnE+9jg|b7lBfte-8RJGygMmQ-!x0s2e&QqOs=rJ%9zy6=qJ) zB{EdkQ7%gWUe$Ps zy_9S<+vIf$!i%)&TQ(U<*PWo}JRA2aHLO;Pb-p205m)&Z9phV9Kv$#7r!#!!rJaGL${}3hvk@8KGOlnZFh%D?==_qwlGGKCk;o-;1IHLFzks%L z>j<~qoBFx78NkkBxzVGcsW?Ihueu(-oDg}W!PU8TGFrE{alIR86z1s%T#lo51U L?(T7yz