On Tue, Aug 20, 2019 at 3:27 PM Malintha Amarasinghe <[email protected]>
wrote:

>
>
> On Mon, 19 Aug 2019, 20:01 Vithursa Mahendrarajah, <[email protected]>
> wrote:
>
>> Hi all,
>>
>> I have started the implementation. When giving roles with userstore
>> domain name separated with "/", *HTTP/1.1 400 Bad Request* error
>> response is returned, as encoded slashes is not allowed by default in
>> tomcat. As suggested in [1], when adding the system property
>> *org.apache.tomcat.util.buf.UDecoder.ALLOW_ENCODED_SLASH=true*, this
>> issue is sorted.
>>
>> After this changes, the request to validate roles in secondary user-store
>> fails with the error response - *HTTP/1.1 401 Unauthorized*. It is due
>> to failed scope validation in [2]. This behavior is observed because the
>> path parameter is decoded during authentication phase. After analysis found
>> that, currently we are using *org.apache.cxf.message.Message.PATH_INFO*
>> parameter ([3]) from request which has the decoded value. In order to
>> resolve this issue, we can use *org.apache.cxf.request.uri* parameter in
>> message which is encoded.
>>
>> For instance, for the request URL -
>> https://localhost:9443/api/am/publisher/v1.0/roles/*Internal%2Fcreator*,
>> org.apache.cxf.message.Message.PATH_INFO:
>> "/api/am/publisher/v1.0/roles/Internal/creator"
>> org.apache.cxf.request.uri:
>> "/api/am/publisher/v1.0/roles/Internal%2Fcreator"
>>
>> If we are proceeding with the following format of request, we need to add
>> the system property and make relevant changes in scope validation logic (
>> WebAppAuthenticatorImpl.java):
>> https://localhost:9443/api/am/publisher/v1.0/roles/
>> *{user-store-name}/{role-name}*
>>
>> However, found [5], [6] related to the security concerns in setting
>> org.apache.tomcat.util.buf.UDecoder.ALLOW_ENCODED_SLASH as true by default.
>>
>> The * org.apache.catalina.connector.CoyoteAdapter.ALLOW_BACKSLASH* and
>>> *org.apache.tomcat.util.buf.UDecoder.ALLOW_ENCODED_SLASH* system
>>> properties allow non-standard parsing of the request URI. Using these
>>> options when behind a reverse proxy may enable an attacker to bypass any
>>> security constraints enforced by the proxy.
>>>
>>
> This is a good finding. Given this issue, I don't think it is a good idea
> to proceed with the encoded slash in the path.
>
>>
>> Alternatively, we can pass user-store in following ways:
>>
>>    1. /roles/{rolename}?userstore={userstore}
>>    2. /userstore/{userstore}/roles/{roleName}
>>    3. /roles/{rolename}/userstore/{userstore}
>>    4. Or, need to have a configurable character to differentiate
>>    user-store and role name. For instance, roles/{userstore}*-*{roleName}
>>
>> Which way we can implement? Appreciate your suggestions regarding this.
>>
>
> How do we treat Internal roles? Can we treat "Internal" as a user store?
>
> Eg: check if "Internal/subscriber" is available:
>
> HEAD /roles/subscriber?userStore=Internal
>
> Is this a valid way of representing it?
>

If we're not allowed to create secondary userstores with the name
"Internal", this should be ok.

Thanks,
Bhathiya


>
>
>>
>> [1] https://issues.apache.org/jira/browse/CXF-4207
>> [2]
>> https://github.com/wso2/carbon-apimgt/blob/master/components/apimgt/org.wso2.carbon.apimgt.rest.api.util/src/main/java/org/wso2/carbon/apimgt/rest/api/util/impl/WebAppAuthenticatorImpl.java#L138
>> [3]
>> https://github.com/wso2/carbon-apimgt/blob/master/components/apimgt/org.wso2.carbon.apimgt.rest.api.util/src/main/java/org/wso2/carbon/apimgt/rest/api/util/impl/WebAppAuthenticatorImpl.java#L113
>> [4]
>> https://serverfault.com/questions/914847/stop-apache-from-decoding-characters-from-uri-for-path-info
>> [5] https://backstage.forgerock.com/knowledge/kb/article/a59558448
>> [6]
>> http://tomcat.apache.org/tomcat-9.0-doc/security-howto.html#System_Properties
>> <http://tomcat.apache.org/tomcat-9.0-doc/security-howto.html>
>>
>> <http://tomcat.apache.org/tomcat-9.0-doc/security-howto.html>
>> Thanks,
>> Vithursa
>>
>> On Fri, Aug 16, 2019 at 11:07 AM Vithursa Mahendrarajah <
>> [email protected]> wrote:
>>
>>> Ack, will do that.
>>>
>>> On Fri, Aug 16, 2019 at 12:16 AM Harsha Kumara <[email protected]> wrote:
>>>
>>>> @Vithursa Mahendrarajah <[email protected]> Once you implement, let's
>>>> add several test cases with special characters, secondary user store roles
>>>> and etc.
>>>>
>>>> On Thu, Aug 15, 2019 at 4:16 PM Vithursa Mahendrarajah <
>>>> [email protected]> wrote:
>>>>
>>>>> Hi all,
>>>>>
>>>>> Thanks for the suggestions. As per the suggestions, we have decided to
>>>>> go with HEAD request option. As mentioned earlier in this thread, 
>>>>> following
>>>>> are the scenarios where role validation is required:
>>>>>
>>>>>    1. API Design phase -
>>>>>    - Publisher access control - check whether the role exists and the
>>>>>       logged-in user has the role
>>>>>    - Store visibility - check whether the role exists or not
>>>>>    2. API Manage phase - when adding new scope - check whether the
>>>>>    role exists or not
>>>>>
>>>>> We have decided to add the OAuth2 scope as apim:api_create as these
>>>>> functionalities are used by API creator.
>>>>>
>>>>> As per the offline discussion had with @Malintha Amarasinghe
>>>>> <[email protected]>  and @Kasun Thennakoon <[email protected]>, when
>>>>> checking whether the logged-in user has particular role, claims in ID 
>>>>> token
>>>>> stored in browser local storage could be used. By considering the
>>>>> possibility of manipulating the ID token in local storage, complexity in
>>>>> handling when using secondary userstore and the security concerns in
>>>>> exposing roles assigned to particular user, we have decided to
>>>>> introduce another REST API to check whether the logged-in user has the
>>>>> given role as this would be more cleaner.
>>>>>
>>>>> Please find the REST API definition as follows:
>>>>>
>>>>> ######################################################
>>>>> # The Role Name Existence
>>>>> ######################################################
>>>>>   /roles/{roleName}:
>>>>> #-----------------------------------------------------
>>>>> # The role name existence check resource
>>>>> #-----------------------------------------------------
>>>>>     head:
>>>>>       security:
>>>>>         - OAuth2Security:
>>>>>             - apim:api_create
>>>>>       summary:
>>>>>         Check given role name already exists
>>>>>       description:
>>>>>         Using this operation, to check whether given role already exists
>>>>>       parameters:
>>>>>         - $ref : '#/parameters/roleName'
>>>>>       responses:
>>>>>         200:
>>>>>           description:
>>>>>             OK.
>>>>>             Requested role name is returned.
>>>>>         404:
>>>>>           description:
>>>>>             Not Found.
>>>>>             Requested role name does not exist.
>>>>>
>>>>> ######################################################
>>>>> # The Role Name Existence for the logged-in user
>>>>> ######################################################
>>>>>   /me/roles/{roleName}:
>>>>> #-----------------------------------------------------
>>>>> # Validate role against a user
>>>>> #-----------------------------------------------------
>>>>>     head:
>>>>>       security:
>>>>>         - OAuth2Security:
>>>>>             - apim:api_create
>>>>>       summary:
>>>>>         Validate whether the logged-in user has the given role
>>>>>       description:
>>>>>         Using this operation, logged-in user can check whether he has 
>>>>> given role.
>>>>>       parameters:
>>>>>         - $ref : '#/parameters/roleName'
>>>>>       responses:
>>>>>         200:
>>>>>           description:
>>>>>             OK.
>>>>>             Logged-in user has the role.
>>>>>         404:
>>>>>           description:
>>>>>             Not Found.
>>>>>             Logged-in user does not have the role.
>>>>>
>>>>> Appreciate any feedback on this.
>>>>>
>>>>> Thanks,
>>>>> Vithursa
>>>>>
>>>>> On Thu, Aug 15, 2019 at 11:35 AM Naduni Pamudika <[email protected]>
>>>>> wrote:
>>>>>
>>>>>> +Vithursa Mahendrarajah <[email protected]>
>>>>>>
>>>>>> On Mon, Aug 12, 2019 at 5:26 PM Sanjeewa Malalgoda <[email protected]>
>>>>>> wrote:
>>>>>>
>>>>>>>
>>>>>>>
>>>>>>> On Thu, Aug 8, 2019 at 9:08 PM Malintha Amarasinghe <
>>>>>>> [email protected]> wrote:
>>>>>>>
>>>>>>>> When we return a 404, it implies that the URL (or the resource)
>>>>>>>> does not exist. Here the URL/resource is */validate-role *(a
>>>>>>>> controller resource) which always exists so it is wrong to return a 
>>>>>>>> 404 at
>>>>>>>> any case.
>>>>>>>>
>>>>>>> Yes agree with this and controller resource(as query params optional
>>>>>>> controller resource will be resource) is not ideal for this.
>>>>>>> Using head would be good option. Like nirmal mentioned any
>>>>>>> additional parameters related to filter criteria can be passed as query
>>>>>>> parameters.
>>>>>>>
>>>>>>> Thanks,
>>>>>>> sanjeewa/
>>>>>>>
>>>>>>>>
>>>>>>>> Thanks!
>>>>>>>>
>>>>>>>> On Thu, Aug 8, 2019 at 7:12 PM Menaka Jayawardena <[email protected]>
>>>>>>>> wrote:
>>>>>>>>
>>>>>>>>> Hi Naduni,
>>>>>>>>>
>>>>>>>>> Wh the GET request always returns 200?
>>>>>>>>> Can't we set the status code 404 if the role is not found? So we
>>>>>>>>> can check the response status from the UI. We do not want to read the 
>>>>>>>>> body
>>>>>>>>> then.
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> On Thu, Aug 8, 2019 at 6:05 PM Naduni Pamudika <[email protected]>
>>>>>>>>> wrote:
>>>>>>>>>
>>>>>>>>>> Hi All,
>>>>>>>>>>
>>>>>>>>>> Thanks all for the suggestions. With the GET method @Bhathiya
>>>>>>>>>> Jayasekara <[email protected]> suggested, we have the following
>>>>>>>>>> 2 options now.
>>>>>>>>>>
>>>>>>>>>> 1. *HEAD /roles/{roleName}*
>>>>>>>>>> 2. *GET /validate-role?role=rolename*
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>> If we go with the option 1, it will simplify the work in the UI
>>>>>>>>>> side while doing the role validations by using the Rest API since we 
>>>>>>>>>> can do
>>>>>>>>>> the validation by looking at the status code (If the role exists it 
>>>>>>>>>> is a
>>>>>>>>>> 200 and if not it is a 404). If we go with the option 2, it will 
>>>>>>>>>> always
>>>>>>>>>> return a 200 status code and we need to check the response body to 
>>>>>>>>>> validate
>>>>>>>>>> a particular role name (We can send *isRoleExist=true* and
>>>>>>>>>> *isRoleExist=false* in the response body depending on the
>>>>>>>>>> existence of a role name).
>>>>>>>>>>
>>>>>>>>>> Since most of us are +1 with the option 2, shall we move forward
>>>>>>>>>> with the GET method?
>>>>>>>>>>
>>>>>>>>>> Thanks,
>>>>>>>>>> Naduni
>>>>>>>>>>
>>>>>>>>>> On Wed, Aug 7, 2019 at 7:27 PM Bhathiya Jayasekara <
>>>>>>>>>> [email protected]> wrote:
>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>> On Wed, Aug 7, 2019 at 6:24 PM Malintha Amarasinghe <
>>>>>>>>>>> [email protected]> wrote:
>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>> On Wed, Aug 7, 2019 at 3:39 PM Harsha Kumara <[email protected]>
>>>>>>>>>>>> wrote:
>>>>>>>>>>>>
>>>>>>>>>>>>>
>>>>>>>>>>>>>
>>>>>>>>>>>>> On Wed, Aug 7, 2019 at 3:37 PM Malintha Amarasinghe <
>>>>>>>>>>>>> [email protected]> wrote:
>>>>>>>>>>>>>
>>>>>>>>>>>>>>
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> On Wed, Aug 7, 2019 at 3:35 PM Harsha Kumara <
>>>>>>>>>>>>>> [email protected]> wrote:
>>>>>>>>>>>>>>
>>>>>>>>>>>>>>> Let's say if someone wants to check existence of role foo in
>>>>>>>>>>>>>>> user store TEST. He will do a call /roke/TEST/foo which isn't 
>>>>>>>>>>>>>>> valid request
>>>>>>>>>>>>>>> right?
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>> @Harsha Kumara <[email protected]>  we need to URL encode the
>>>>>>>>>>>>>> role name. The request will become /roles/TEST%2Ffoo
>>>>>>>>>>>>>>
>>>>>>>>>>>>> Yes that's true. Again some customers might have different
>>>>>>>>>>>>> letters in their role names. Might note be a good idea to include 
>>>>>>>>>>>>> as a path
>>>>>>>>>>>>> parameter.
>>>>>>>>>>>>>
>>>>>>>>>>>> Even if we add as a query param, that will go as part of the
>>>>>>>>>>>> URL which might lead to similar issues? We may need to test this 
>>>>>>>>>>>> for query
>>>>>>>>>>>> parameters as well.
>>>>>>>>>>>>
>>>>>>>>>>>> I preferred the HEAD method due to the simpleness ( only need
>>>>>>>>>>>> to respond with 204 or 404 without any payload based on the 
>>>>>>>>>>>> availability of
>>>>>>>>>>>> the role) and RESTfulness (consider a role as a resource and do a 
>>>>>>>>>>>> fetch on
>>>>>>>>>>>> it in the usual way). HEAD is the usual way for checking the 
>>>>>>>>>>>> existence of a
>>>>>>>>>>>> resource. However, we do not have the need for implementing a GET 
>>>>>>>>>>>> here for
>>>>>>>>>>>> now.
>>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>> This is actually my worry is. I don't think we'll ever have to
>>>>>>>>>>> give a /roles/{role} in the publisher APIs. So having a HEAD 
>>>>>>>>>>> without a GET
>>>>>>>>>>> feels strange to me. Maybe it's just me.
>>>>>>>>>>>
>>>>>>>>>>> Thanks,
>>>>>>>>>>> Bhathiya
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>> On Wed, Aug 7, 2019 at 3:33 PM Mushthaq Rumy <
>>>>>>>>>>>>>>> [email protected]> wrote:
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>> Adding [Architecture]
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>> On Wed, Aug 7, 2019 at 3:30 PM Mushthaq Rumy <
>>>>>>>>>>>>>>>> [email protected]> wrote:
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>> Since we will be UserStoreManager, this should cover the
>>>>>>>>>>>>>>>>> secondary user stores as well.
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>> Thanks & Regards,
>>>>>>>>>>>>>>>>> Mushthaq
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>> On Wed, Aug 7, 2019 at 3:28 PM Harsha Kumara <
>>>>>>>>>>>>>>>>> [email protected]> wrote:
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>> What happen if the role is from secondary user store?
>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>> On Wed, Aug 7, 2019 at 3:24 PM Naduni Pamudika <
>>>>>>>>>>>>>>>>>> [email protected]> wrote:
>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>> Hi All,
>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>> We are planning to add a REST API endpoint to APIM 3.0
>>>>>>>>>>>>>>>>>>> Publisher Rest APIs and the intention is to check the 
>>>>>>>>>>>>>>>>>>> existence of a
>>>>>>>>>>>>>>>>>>> particular role name. This will be used in order to manage 
>>>>>>>>>>>>>>>>>>> roles when
>>>>>>>>>>>>>>>>>>> enabling Publisher Access Control and Store Visibility and 
>>>>>>>>>>>>>>>>>>> when adding
>>>>>>>>>>>>>>>>>>> Scopes.
>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>> The swagger definition for the new endpoint would be as
>>>>>>>>>>>>>>>>>>> follows.
>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>> ######################################################
>>>>>>>>>>>>>>>>>>> # The Role Name Existence
>>>>>>>>>>>>>>>>>>> ######################################################
>>>>>>>>>>>>>>>>>>>   /roles/{roleName}:
>>>>>>>>>>>>>>>>>>> #-----------------------------------------------------
>>>>>>>>>>>>>>>>>>> # The role name existence check resource
>>>>>>>>>>>>>>>>>>> #-----------------------------------------------------
>>>>>>>>>>>>>>>>>>>     head:
>>>>>>>>>>>>>>>>>>>       security:
>>>>>>>>>>>>>>>>>>>         - OAuth2Security:
>>>>>>>>>>>>>>>>>>>             - apim:api_view
>>>>>>>>>>>>>>>>>>>       summary: |
>>>>>>>>>>>>>>>>>>>         Check given role name is already exist
>>>>>>>>>>>>>>>>>>>       description: |
>>>>>>>>>>>>>>>>>>>             Using this operation, you can check a given
>>>>>>>>>>>>>>>>>>> role name is already used. You need to provide the role 
>>>>>>>>>>>>>>>>>>> name you want to
>>>>>>>>>>>>>>>>>>> check.
>>>>>>>>>>>>>>>>>>>       parameters:
>>>>>>>>>>>>>>>>>>>         - $ref : '#/parameters/roleName'
>>>>>>>>>>>>>>>>>>>       responses:
>>>>>>>>>>>>>>>>>>>         200:
>>>>>>>>>>>>>>>>>>>           description: |
>>>>>>>>>>>>>>>>>>>             OK.
>>>>>>>>>>>>>>>>>>>             Requested role name is returned.
>>>>>>>>>>>>>>>>>>>         404:
>>>>>>>>>>>>>>>>>>>           description: |
>>>>>>>>>>>>>>>>>>>             Not Found.
>>>>>>>>>>>>>>>>>>>             Requested role name does not exist.
>>>>>>>>>>>>>>>>>>> ######################################################
>>>>>>>>>>>>>>>>>>> # Role Name
>>>>>>>>>>>>>>>>>>>   roleName:
>>>>>>>>>>>>>>>>>>>     name: roleName
>>>>>>>>>>>>>>>>>>>     in: path
>>>>>>>>>>>>>>>>>>>     description: |
>>>>>>>>>>>>>>>>>>>       The role name
>>>>>>>>>>>>>>>>>>>     required: true
>>>>>>>>>>>>>>>>>>>     type: string
>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>> It is a HEAD method (*/roles/{roleName}*) which will
>>>>>>>>>>>>>>>>>>> return a 200 status code if the given role name exists and 
>>>>>>>>>>>>>>>>>>> a 404 status
>>>>>>>>>>>>>>>>>>> code if the give role name is not found. Sample requests 
>>>>>>>>>>>>>>>>>>> and responses are
>>>>>>>>>>>>>>>>>>> given below.
>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>> Request:
>>>>>>>>>>>>>>>>>>> HEAD
>>>>>>>>>>>>>>>>>>> https://localhost:9443/api/am/publisher/v1.0/roles/valid-role
>>>>>>>>>>>>>>>>>>> HTTP/1.1
>>>>>>>>>>>>>>>>>>> Authorization: Bearer
>>>>>>>>>>>>>>>>>>> ae4eae22-3f65-387b-a171-d37eaa366fa8
>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>> Response:
>>>>>>>>>>>>>>>>>>> HTTP/1.1 200 OK
>>>>>>>>>>>>>>>>>>> Connection: keep-alive
>>>>>>>>>>>>>>>>>>> Content-Length: 0
>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>> Request:
>>>>>>>>>>>>>>>>>>> HEAD
>>>>>>>>>>>>>>>>>>> https://localhost:9443/api/am/publisher/v1.0/roles/invalid-role
>>>>>>>>>>>>>>>>>>> HTTP/1.1
>>>>>>>>>>>>>>>>>>> Authorization: Bearer
>>>>>>>>>>>>>>>>>>> ae4eae22-3f65-387b-a171-d37eaa366fa8
>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>> Response:
>>>>>>>>>>>>>>>>>>> HTTP/1.1 404 Not Found
>>>>>>>>>>>>>>>>>>> Connection: keep-alive
>>>>>>>>>>>>>>>>>>> Content-Length: 0
>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>> Are we good to have the endpoint definition as this?
>>>>>>>>>>>>>>>>>>> Appreciate your inputs to proceed further.
>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>> Thanks,
>>>>>>>>>>>>>>>>>>> Naduni
>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>> --
>>>>>>>>>>>>>>>>>>> *Naduni Pamudika* | Senior Software Engineer | WSO2 Inc.
>>>>>>>>>>>>>>>>>>> (m) +94 (71) 9143658 | (w) +94 (11) 2145345 | (e)
>>>>>>>>>>>>>>>>>>> [email protected]
>>>>>>>>>>>>>>>>>>> [image: http://wso2.com/signature]
>>>>>>>>>>>>>>>>>>> <http://wso2.com/signature>
>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>> --
>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>> *Harsha Kumara*
>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>> Technical Lead, WSO2 Inc.
>>>>>>>>>>>>>>>>>> Mobile: +94775505618
>>>>>>>>>>>>>>>>>> Email: [email protected]
>>>>>>>>>>>>>>>>>> Blog: harshcreationz.blogspot.com
>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>> GET INTEGRATION AGILE
>>>>>>>>>>>>>>>>>> Integration Agility for Digitally Driven Business
>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>> --
>>>>>>>>>>>>>>>>> Mushthaq Rumy
>>>>>>>>>>>>>>>>> *Senior Software Engineer*
>>>>>>>>>>>>>>>>> Mobile : +94 (0) 779 492140
>>>>>>>>>>>>>>>>> Email : [email protected]
>>>>>>>>>>>>>>>>> WSO2, Inc.; http://wso2.com/
>>>>>>>>>>>>>>>>> lean . enterprise . middleware.
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>> <http://wso2.com/signature>
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>> --
>>>>>>>>>>>>>>>> Mushthaq Rumy
>>>>>>>>>>>>>>>> *Senior Software Engineer*
>>>>>>>>>>>>>>>> Mobile : +94 (0) 779 492140
>>>>>>>>>>>>>>>> Email : [email protected]
>>>>>>>>>>>>>>>> WSO2, Inc.; http://wso2.com/
>>>>>>>>>>>>>>>> lean . enterprise . middleware.
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>> <http://wso2.com/signature>
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>> --
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>> *Harsha Kumara*
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>> Technical Lead, WSO2 Inc.
>>>>>>>>>>>>>>> Mobile: +94775505618
>>>>>>>>>>>>>>> Email: [email protected]
>>>>>>>>>>>>>>> Blog: harshcreationz.blogspot.com
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>> GET INTEGRATION AGILE
>>>>>>>>>>>>>>> Integration Agility for Digitally Driven Business
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> --
>>>>>>>>>>>>>> Malintha Amarasinghe
>>>>>>>>>>>>>> *WSO2, Inc. - lean | enterprise | middleware*
>>>>>>>>>>>>>> http://wso2.com/
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> Mobile : +94 712383306
>>>>>>>>>>>>>>
>>>>>>>>>>>>>
>>>>>>>>>>>>>
>>>>>>>>>>>>> --
>>>>>>>>>>>>>
>>>>>>>>>>>>> *Harsha Kumara*
>>>>>>>>>>>>>
>>>>>>>>>>>>> Technical Lead, WSO2 Inc.
>>>>>>>>>>>>> Mobile: +94775505618
>>>>>>>>>>>>> Email: [email protected]
>>>>>>>>>>>>> Blog: harshcreationz.blogspot.com
>>>>>>>>>>>>>
>>>>>>>>>>>>> GET INTEGRATION AGILE
>>>>>>>>>>>>> Integration Agility for Digitally Driven Business
>>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>> --
>>>>>>>>>>>> Malintha Amarasinghe
>>>>>>>>>>>> *WSO2, Inc. - lean | enterprise | middleware*
>>>>>>>>>>>> http://wso2.com/
>>>>>>>>>>>>
>>>>>>>>>>>> Mobile : +94 712383306
>>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>> --
>>>>>>>>>>> *Bhathiya Jayasekara* | Technical Lead | WSO2 Inc.
>>>>>>>>>>> (m) +94 71 547 8185  | (e) bhathiya-@t-wso2-d0t-com
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>> --
>>>>>>>>>> *Naduni Pamudika* | Senior Software Engineer | WSO2 Inc.
>>>>>>>>>> (m) +94 (71) 9143658 | (w) +94 (11) 2145345 | (e) [email protected]
>>>>>>>>>> [image: http://wso2.com/signature] <http://wso2.com/signature>
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>
>>>>>>>>> --
>>>>>>>>>
>>>>>>>>> *Menaka Jayawardena*
>>>>>>>>> Senior Software Engineer | WSO2 Inc.
>>>>>>>>> +94 71 350 5470 | +94 76 717 2511 | [email protected]
>>>>>>>>>
>>>>>>>>> <https://wso2.com/signature>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>
>>>>>>>> --
>>>>>>>> Malintha Amarasinghe
>>>>>>>> *WSO2, Inc. - lean | enterprise | middleware*
>>>>>>>> http://wso2.com/
>>>>>>>>
>>>>>>>> Mobile : +94 712383306
>>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>> --
>>>>>>> *Sanjeewa Malalgoda*
>>>>>>> Software Architect | Associate Director, Engineering - WSO2 Inc.
>>>>>>> (m) +94 712933253 | (e) [email protected] | (b) Blogger
>>>>>>> <http://sanjeewamalalgoda.blogspot.com>, Medium
>>>>>>> <https://medium.com/@sanjeewa190>
>>>>>>>
>>>>>>> GET INTEGRATION AGILE <https://wso2.com/signature>
>>>>>>> Integration Agility for Digitally Driven Business
>>>>>>>
>>>>>>
>>>>>>
>>>>>> --
>>>>>> *Naduni Pamudika* | Senior Software Engineer | WSO2 Inc.
>>>>>> (m) +94 (71) 9143658 | (w) +94 (11) 2145345 | (e) [email protected]
>>>>>> [image: http://wso2.com/signature] <http://wso2.com/signature>
>>>>>>
>>>>>>
>>>>>
>>>>> --
>>>>> Vithursa Mahendrarajah
>>>>> Software Engineer
>>>>> WSO2 Inc. - http ://wso2.com
>>>>> Mobile  : +947*66695643* <+94%2077%20819%201300>
>>>>>
>>>>>
>>>>> * <http://wso2.com/signature> <http://wso2.com/signature>
>>>>> <http://wso2.com/signature>*
>>>>>
>>>>
>>>>
>>>> --
>>>>
>>>> *Harsha Kumara*
>>>>
>>>> Technical Lead, WSO2 Inc.
>>>> Mobile: +94775505618
>>>> Email: [email protected]
>>>> Blog: harshcreationz.blogspot.com
>>>>
>>>> GET INTEGRATION AGILE
>>>> Integration Agility for Digitally Driven Business
>>>>
>>>
>>>
>>> --
>>> Vithursa Mahendrarajah
>>> Software Engineer
>>> WSO2 Inc. - http ://wso2.com
>>> Mobile  : +947*66695643* <+94%2077%20819%201300>
>>>
>>>
>>> * <http://wso2.com/signature> <http://wso2.com/signature>
>>> <http://wso2.com/signature>*
>>>
>>
>>
>> --
>> Vithursa Mahendrarajah
>> Software Engineer
>> WSO2 Inc. - http ://wso2.com
>> Mobile  : +947*66695643* <+94%2077%20819%201300>
>>
>>
>> * <http://wso2.com/signature> <http://wso2.com/signature>
>> <http://wso2.com/signature>*
>>
>

-- 
*Bhathiya Jayasekara* | Technical Lead | WSO2 Inc.
(m) +94 71 547 8185  | (e) bhathiya-@t-wso2-d0t-com
_______________________________________________
Architecture mailing list
[email protected]
https://mail.wso2.org/cgi-bin/mailman/listinfo/architecture

Reply via email to