Using Regex to validate user input on Portal

Hi Experts,

I have a requirement to validate user input using a regex, which doesn’t seem directly feasible in the portal. After exploring recommendations from the community, I implemented the following approach:

  1. I created a Web API that uses the regex to validate user input.
  2. This Web API is called within Appian's integration object.
  3. The integration object is then used in the validation condition of the input field in the Portal UI.

Could you please confirm if this approach is reliable?

Additionally, should the API key used to authenticate the Web API be created with the same service account used in the Portal object, or should it be created with a separate service account to ensure a secure design?

++      

Please suggest your views on this

  Discussion posts and replies are publicly visible

Parents Reply Children
  • A Score Level 2
    in reply to Peter Lewis

    Hi Peter,

    Here is the expression we used to successfully implement the IP validation, not sure if we can achieve this with nested if logic or not.?

    Please suggest.

    a!localVariables(
      local!ipv4regex: "^((25[0-5]|(2[0-4]|1\d|[1-9]|)\d)\.?\b){4}$",
      local!ipv6Regex: "^([0-9a-fA-F]{0,4}:){7}[0-9a-fA-F]{0,4}$",
      local!classAip: "^10\.((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([1-9][0-9])|([0-9]))\.((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([1-9][0-9])|([0-9]))\.((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([1-9][0-9])|([0-9]))$",
      local!classBip: "^172\.(?:1[6-9]|2[0-9]|3[0-1])\.((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([1-9][0-9])|([0-9]))\.((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([1-9][0-9])|([0-9]))$",
      local!classCip: "^192\.168\.((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([1-9][0-9])|([0-9]))\.((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([1-9][0-9])|([0-9]))$",
      local!classAPort: "^10\.((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([1-9][0-9])|([0-9]))\.((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([1-9][0-9])|([0-9]))\.((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([1-9][0-9])|([0-9]))(\_)(6553[0-5]|655[0-2][0-9]|65[0-4][0-9][0-9]|6[0-4][0-9][0-9][0-9]|[1-5][0-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9]|[0-9])$",
      local!classBPort: "^172\.(?:1[6-9]|2[0-9]|3[0-1])\.((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([1-9][0-9])|([0-9]))\.((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([1-9][0-9])|([0-9]))(\_)(6553[0-5]|655[0-2][0-9]|65[0-4][0-9][0-9]|6[0-4][0-9][0-9][0-9]|[1-5][0-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9]|[0-9])$",
      local!classCPort: "^192\.168\.((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([1-9][0-9])|([0-9]))\.((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([1-9][0-9])|([0-9]))(\_)(6553[0-5]|655[0-2][0-9]|65[0-4][0-9][0-9]|6[0-4][0-9][0-9][0-9]|[1-5][0-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9]|[0-9])$",
      local!nat444Regex: "^((25[0-5]|(2[0-4]|1\d|[1-9]|)\d)\.){3}(25[0-5]|(2[0-4]|1\d|[1-9]|)\d)(\_)(6553[0-5]|655[0-2][0-9]|65[0-4][0-9][0-9]|6[0-4][0-9][0-9][0-9]|[1-5][0-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9]|[0-9])$",
      local!nat64Regex: "^([0-9a-fA-F]{0,4}:){7}[0-9a-fA-F]{0,4}(\_)(6553[0-5]|655[0-2][0-9]|65[0-4][0-9][0-9]|6[0-4][0-9][0-9][0-9]|[1-5][0-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9]|[0-9])$",
      local!privateIP100: "Some Validation",
      local!PrivateIP25: "Some Validation",
      local!Private100Regex: "Some Validation",
      local!Private25Regax: "Some Validation",
      if(
        regexmatch(local!classAip, ri!ipAddress),
        ri!ipAddress,
        if(
          regexmatch(local!classBip, ri!ipAddress),
          ri!ipAddress,
          if(
            regexmatch(local!classCip, ri!ipAddress),
            ri!ipAddress,
            if(
              regexmatch(local!classAPort, ri!ipAddress),
              ri!ipAddress,
              if(
                regexmatch(local!classBPort, ri!ipAddress),
                ri!ipAddress,
                if(
                  regexmatch(local!classCPort, ri!ipAddress),
                  ri!ipAddress,
                  if(
                    regexmatch(local!privateIP100, ri!ipAddress),
                    ri!ipAddress,
                    if(
                      regexmatch(local!PrivateIP25, ri!ipAddress),
                      ri!ipAddress,
                      if(
                        regexmatch(local!Private100Regex, ri!ipAddress),
                        ri!ipAddress,
                        if(
                          regexmatch(local!Private25Regax, ri!ipAddress),
                          ri!ipAddress,
                          if(
                            regexmatch(local!ipv4Regex, ri!ipAddress),
                            {},
                              if(
                                regexmatch(local!nat444Regex, ri!ipAddress),
                                {},
                                if(
                                  and(
                                    regexmatch(local!nat64Regex, ri!ipAddress),
                                    count(split(ri!ipAddress,"_"))=2,
                                    count(split(split(ri!ipAddress,"_")[1],":"))=8,
                                    not(rule!CC_isBlank(split(split(ri!ipAddress,"_")[1],":")[8])),
                                    not(rule!CC_isBlank(split(split(ri!ipAddress,"_")[1],":")[1])),
                                  ),
                                  {},
                                  if(
                                    and(
                                      regexmatch(local!ipv6Regex, ri!ipAddress),
                                      count(split(ri!ipAddress,":"))=8,
                                      not(rule!CC_isBlank(split(ri!ipAddress,":")[1])),
                                      not(rule!CC_isBlank(split(ri!ipAddress,":")[8]))
                                    ), 
                                    {},
                                  ri!ipAddress
                                )
                              )
                            )
                          )
                        )
                      )
                    )
                  )
                )
              )
            )
          )
        )
      )
    )

  • Appian Employee
    in reply to GauravSingh

    Ah okay - that's a fairly detailed regex expression. I would guess that it is still possible to do that validation outside of regex in Appian, but probably would involve a very complex Appian expression, so it may not be worth it. I just wanted to verify that it wasn't a basic check that could fairly easily be replicated in Appian so you wouldn't need the full integration.