Pin Code : rudimentary ui security

This subflow provides a very basic mechanism for securing dashboard ui.

Use it in conjunction with dashboard's ui-control node to show/hide tabs.

Example Logic

flowchart TD;
    A((user)) -- connects to dashboard --> B(Lock Tab: hide tabs, must enter passcode to continue);
    B -- enter passcode --> C{if};
    C -- success --> D(Default Tab);
    C -- fail --> B;
    D -- navigate to lock tab--> B;
[{"id":"23c3d5655f3acd36","type":"subflow","name":"pin code","info":"This subflow provides a very basic user authentication logic.\r\n\r\n## Input\r\n\r\n`msg.payload : 'string'` adds pincode characters.\r\n\r\n`msg.payload : 'boolean'` `true` evaluates input against code property, `false` clears user input.","category":"","in":[{"x":60,"y":100,"wires":[{"id":"7daf7c3b07a3efad"}]}],"out":[{"x":360,"y":60,"wires":[{"id":"7daf7c3b07a3efad","port":0}]},{"x":380,"y":140,"wires":[{"id":"7daf7c3b07a3efad","port":1}]}],"env":[{"name":"code","type":"str","value":"999","ui":{"type":"input","opts":{"types":["str"]}}}],"meta":{"module":"Pin Code","version":"1.0.0","author":"alex","keywords":"password, pin, code,","license":"Apache-2.0"},"color":"#DDAA99","outputLabels":["user input","evaluation result"],"icon":"font-awesome/fa-key"},{"id":"7daf7c3b07a3efad","type":"function","z":"23c3d5655f3acd36","name":"","func":"context.input = context.input || '';\nvar msg1, msg2;\nmsg1 = msg2 = msg;\n\nif (typeof msg.payload === 'string') {\n    context.input = context.input + msg.payload;\n    msg1.payload = context.input;\n    return [msg1, null];\n}\nelse if (typeof msg.payload === 'boolean') {\n    if (msg.payload === true) {\n        if (context.input === env.get('code')) {\n            context.input = '';\n            msg1.payload = context.input;\n            msg2.payload = true;\n            return [msg1, msg2];\n        }\n        else {\n            context.input = '';\n            msg1.payload = context.input;\n            msg2.payload = false;\n            return [msg1, msg2];\n        }\n    }\n    else {\n        context.input = '';\n        msg1.payload = context.input;\n        return [msg1, null];\n    }\n}","outputs":2,"noerr":0,"initialize":"","finalize":"","libs":[],"x":180,"y":100,"wires":[[],[]]},{"id":"2f4b604acd569f69","type":"subflow:23c3d5655f3acd36","z":"e59a20d3df49f815","name":"","env":[{"name":"backdoor","value":"1999","type":"str"}],"x":320,"y":240,"wires":[["0de35398752d1147","66c8c71187467506"],["665c79e1658090bc"]]},{"id":"25f0058521b03b5f","type":"inject","z":"e59a20d3df49f815","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"1","payloadType":"str","x":110,"y":40,"wires":[["2f4b604acd569f69"]]},{"id":"6ebcbbc434298baa","type":"debug","z":"e59a20d3df49f815","name":"entered pincode","active":true,"tosidebar":false,"console":false,"tostatus":true,"complete":"payload","targetType":"msg","statusVal":"payload","statusType":"auto","x":680,"y":100,"wires":[]},{"id":"d2902e95950606f1","type":"inject","z":"e59a20d3df49f815","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"2","payloadType":"str","x":110,"y":80,"wires":[["2f4b604acd569f69"]]},{"id":"b8448845a170f84d","type":"inject","z":"e59a20d3df49f815","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"3","payloadType":"str","x":110,"y":120,"wires":[["2f4b604acd569f69"]]},{"id":"c9c3dba3f6903149","type":"inject","z":"e59a20d3df49f815","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"4","payloadType":"str","x":110,"y":160,"wires":[["2f4b604acd569f69"]]},{"id":"16e353be53511141","type":"inject","z":"e59a20d3df49f815","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"5","payloadType":"str","x":110,"y":200,"wires":[["2f4b604acd569f69"]]},{"id":"4f87f9c752b061ab","type":"inject","z":"e59a20d3df49f815","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"6","payloadType":"str","x":110,"y":240,"wires":[["2f4b604acd569f69"]]},{"id":"849e4fe22129beda","type":"inject","z":"e59a20d3df49f815","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"7","payloadType":"str","x":110,"y":280,"wires":[["2f4b604acd569f69"]]},{"id":"c561c4aa1bb70110","type":"inject","z":"e59a20d3df49f815","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"8","payloadType":"str","x":110,"y":320,"wires":[["2f4b604acd569f69"]]},{"id":"f126213740662b3e","type":"inject","z":"e59a20d3df49f815","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"9","payloadType":"str","x":110,"y":360,"wires":[["2f4b604acd569f69"]]},{"id":"43a9ae0971f5bb58","type":"inject","z":"e59a20d3df49f815","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"0","payloadType":"str","x":110,"y":400,"wires":[["2f4b604acd569f69"]]},{"id":"44df3bee71c36f2c","type":"inject","z":"e59a20d3df49f815","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"true","payloadType":"bool","x":110,"y":480,"wires":[["2f4b604acd569f69"]]},{"id":"b46dda7821f2459c","type":"inject","z":"e59a20d3df49f815","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"false","payloadType":"bool","x":110,"y":520,"wires":[["2f4b604acd569f69"]]},{"id":"c153ec9a977e268e","type":"debug","z":"e59a20d3df49f815","name":"evaluation result","active":true,"tosidebar":false,"console":false,"tostatus":true,"complete":"payload","targetType":"msg","statusVal":"payload","statusType":"auto","x":680,"y":280,"wires":[]},{"id":"0de35398752d1147","type":"function","z":"e59a20d3df49f815","name":"hide entry","func":"var starred = '';\n\nfor (let i = 1; i <= msg.payload.length; i++) {\n    starred = starred + '*'\n}\n\nmsg.payload = starred;\n\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":500,"y":160,"wires":[["2561fab0a86ef4dc"]]},{"id":"2561fab0a86ef4dc","type":"debug","z":"e59a20d3df49f815","name":"entered pincode *","active":true,"tosidebar":false,"console":false,"tostatus":true,"complete":"payload","targetType":"msg","statusVal":"payload","statusType":"auto","x":690,"y":160,"wires":[]},{"id":"66c8c71187467506","type":"junction","z":"e59a20d3df49f815","x":440,"y":100,"wires":[["6ebcbbc434298baa"]]},{"id":"665c79e1658090bc","type":"junction","z":"e59a20d3df49f815","x":440,"y":280,"wires":[["c153ec9a977e268e"]]}]

Flow Info

Created 1 year, 11 months ago
Rating: not yet rated

Owner

Actions

Rate:

Node Types

Core
  • debug (x3)
  • function (x2)
  • inject (x12)
Other
  • junction (x2)
  • subflow (x1)
  • subflow:23c3d5655f3acd36 (x1)

Tags

  • passcode
  • password
  • security
  • pin
Copy this flow JSON to your clipboard and then import into Node-RED using the Import From > Clipboard (Ctrl-I) menu option