WebUI Cleanup, icons, Profile Wireframing (#910)

* account person extend was showing failure when succeeding
* first run on a user profile page, did some other CSS tweaks to the UI
* UI neatening, profile wireframing, robotstxt, PWA manifest
* adding domain_display_name to webmanifest
This commit is contained in:
James Hodgkinson 2022-07-07 18:57:28 +10:00 committed by GitHub
parent 1d64405387
commit 403016b0f8
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
30 changed files with 1509 additions and 1097 deletions

219
artwork/logo-login.svg Normal file
View file

@ -0,0 +1,219 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="520"
height="330"
viewBox="0 0 137.58334 87.3125"
version="1.1"
id="svg1084"
inkscape:version="1.2 (dc2aeda, 2022-05-15)"
sodipodi:docname="logo-login.svg"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<sodipodi:namedview
id="namedview1086"
pagecolor="#ffffff"
bordercolor="#000000"
borderopacity="0.25"
inkscape:showpageshadow="2"
inkscape:pageopacity="0"
inkscape:pagecheckerboard="true"
inkscape:deskcolor="#d1d1d1"
inkscape:document-units="mm"
showgrid="false"
inkscape:zoom="1.0318481"
inkscape:cx="188.98131"
inkscape:cy="109.02768"
inkscape:window-width="1389"
inkscape:window-height="819"
inkscape:window-x="51"
inkscape:window-y="25"
inkscape:window-maximized="0"
inkscape:current-layer="layer1" />
<defs
id="defs1081" />
<g
inkscape:label="Kanidm Login Logo"
inkscape:groupmode="layer"
id="layer1"
transform="translate(-44.452119,-54.465481)">
<path
id="path5404"
d="m 62.537712,110.23377 c -3.36297,8.12708 5.78522,15.61876 5.82446,15.73981 -1.67096,-4.90156 -3.43697,-8.85836 -0.189,-12.28424"
style="display:inline;fill:#803300;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
inkscape:label="kani-rear-claw-left"
inkscape:export-filename="../1d28c49c/party-kani.png"
inkscape:export-xdpi="160.64"
inkscape:export-ydpi="160.64" />
<path
style="display:inline;fill:#803300;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 138.4423,109.69923 c 3.36297,8.12708 -5.78522,15.61876 -5.82446,15.7398 1.67096,-4.90155 3.43697,-8.85835 0.189,-12.28423"
id="path5408"
inkscape:label="kani-rear-claw-right" />
<path
id="path4529"
d="m 100.24698,67.21217 c -1.308628,-0.01556 -2.560878,2.352773 -4.890668,6.986654 -7.05187,-7.755768 -7.41258,-7.849666 -9.84229,2.649966 -0.11364,0.04758 -0.22709,0.0959 -0.34055,0.144695 -8.88231,-5.324406 -9.34124,-5.366051 -8.66717,5.041551 -0.21569,0.159933 -0.43121,0.322088 -0.64596,0.486794 -9.102,-3.605578 -9.49555,-3.378386 -7.19232,6.611477 -0.10784,0.11671 -0.21599,0.23284 -0.3235,0.35089 -9.27685,-2.506375 -9.53641,-2.129764 -6.07663,7.65845 -0.14847,0.21295 -0.29578,0.42957 -0.44338,0.64544 -10.45618,-1.11775 -10.67098,-0.91353 -5.35523,8.828413 -0.026,0.0482 -0.0526,0.0943 -0.0786,0.14263 -4.28381,2.04782 -5.70197,4.54381 -7.73183,7.89409 -0.15756,6.64457 6.9544,12.37105 17.18035,18.87895 -3.51325,-6.5113 -9.00735,-9.81207 -10.0614,-17.88832 1.54367,-2.90538 4.16877,-3.90901 6.42286,-5.21622 24.61995,14.36815 50.615808,14.53471 76.550928,-0.55035 2.26015,1.31503 4.90084,2.31509 6.45076,5.23224 -1.05405,8.07624 -6.54866,11.3765 -10.06191,17.8878 10.22594,-6.5079 17.33842,-12.23387 17.18086,-18.87844 -1.97354,-3.25733 -3.37677,-5.706 -7.38973,-7.72149 5.01291,-9.218263 4.53571,-9.305023 -5.98567,-8.177293 -0.0891,-0.1152 -0.17795,-0.23186 -0.26717,-0.34623 3.63467,-10.261532 3.40665,-10.529692 -6.39186,-7.87136 2.47993,-10.705895 2.14854,-10.749554 -7.77938,-6.803718 0.74781,-11.285018 0.47993,-11.261581 -8.88835,-5.642548 -2.49815,-10.818768 -2.79293,-10.786576 -9.94048,-2.924887 -2.68846,-4.933638 -4.10296,-7.403383 -5.43173,-7.419184 z"
style="display:inline;fill:#ff6600;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
inkscape:label="kani-body" />
<g
id="g5758"
transform="translate(-2.3193819,-7.5517449)"
style="display:inline"
inkscape:label="kani-face">
<path
style="display:inline;fill:#d45500;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 98.808992,121.55238 c -0.682767,-0.0559 4.468828,10.17565 8.051908,0.17277 0.24133,-0.67372 -3.69223,2.90976 -8.051908,-0.17277 z"
id="path5399"
inkscape:label="kani-smile" />
<g
id="g351"
inkscape:label="kani-eye-left">
<path
style="fill:#000000;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 93.212672,111.5632 c -5.131386,10.99206 5.618332,14.73472 4.412511,4.11951 -0.319289,-3.2881 -2.328089,-7.17448 -4.412511,-4.11951 z"
id="path5415" />
<path
style="fill:#ffffff;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 95.394393,112.41429 c -1.183441,1.51896 -0.08172,3.83605 -0.09872,3.98526 1.674403,1.64132 1.61267,-4.77034 0.09872,-3.98526 z"
id="path5417" />
</g>
<g
id="g355"
inkscape:label="kani-eye-right">
<path
id="path5433"
d="m 109.6169,111.5632 c -5.13141,10.99206 5.61836,14.73472 4.41254,4.11951 -0.31929,-3.2881 -2.3281,-7.17448 -4.41254,-4.11951 z"
style="fill:#000000;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
<path
id="path5435"
d="m 111.79864,112.41429 c -1.18345,1.51896 -0.0817,3.83605 -0.0987,3.98526 1.67441,1.64132 1.61267,-4.77034 0.0987,-3.98526 z"
style="display:inline;fill:#ffffff;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
</g>
</g>
<path
id="path5389"
d="m 75.334492,106.8255 c -0.51041,0.004 -0.85068,0.0544 -0.79478,0.0889 0,0 -9.13406,11.93611 0.31006,18.65881 a 9.7471106,8.2770874 37.793943 0 0 1.43712,9.42372 9.7471106,8.2770874 37.793943 0 0 10.56473,3.9672 l -3.56412,-8.60569 9.19685,0.73536 a 9.7471106,8.2770874 37.793943 0 0 -7.02645,-8.91057 9.7471106,8.2770874 37.793943 0 0 -7.00784,0.009 c -1.86231,-1.36401 -4.6287,-4.92596 -0.0408,-12.47521 1.51807,-2.49795 -1.54349,-2.90314 -3.07475,-2.89129 z"
style="display:inline;fill:#ff6600;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
inkscape:label="kani-claw-left-down" />
<g
transform="translate(-12.063571,-65.570169)"
id="g5751"
inkscape:label="passport"
style="display:inline">
<path
style="display:inline;opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 142.55119,137.92594 27.3632,-15.27364 21.39613,38.33184 -27.36321,15.27364 z"
id="path5730" />
<path
id="path5734"
d="m 142.55119,137.92594 27.3632,-15.27364 21.39613,38.33184 -27.36321,15.27364 -6.27068,-11.23547 c 3.50932,-3.1137 4.19635,-7.01138 3.17635,-11.38324 l -7.39141,3.83317 z"
style="display:inline;opacity:1;fill:#2a3455;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
sodipodi:nodetypes="cccccccc" />
<g
id="g1027"
transform="matrix(0.86024749,-0.10202883,0.10202883,0.86024749,30.096406,71.933538)"
style="display:inline"
inkscape:label="passport-kani">
<path
id="path4529-1"
d="m 142.60294,99.070411 c -0.25799,0.104739 -0.3086,0.672471 -0.384,1.773409 -2.02218,-0.940695 -2.10067,-0.929408 -1.71256,1.33048 -0.0183,0.0187 -0.0366,0.0375 -0.0549,0.0564 -2.18101,-0.31296 -2.27447,-0.28333 -1.28505,1.70286 -0.0291,0.0491 -0.0581,0.0987 -0.0866,0.1487 -2.08254,0.0423 -2.14104,0.11931 -0.86643,1.88938 -0.0116,0.0318 -0.0232,0.0635 -0.0346,0.0955 -2.02632,0.27237 -2.04621,0.36762 -0.56133,2.00288 -0.0116,0.054 -0.0226,0.10863 -0.0338,0.16313 -2.1433,0.64191 -2.16862,0.69967 -0.32345,2.17298 -0.001,0.0115 -0.002,0.0228 -0.004,0.0345 -0.67172,0.75455 -0.74436,1.361 -0.86664,2.18542 0.51637,1.31647 2.38318,1.85412 4.92525,2.2886 -1.22549,-0.98801 -2.57514,-1.18304 -3.44709,-2.68058 0.0635,-0.6971 0.49586,-1.1102 0.83039,-1.55228 6.0132,0.79095 11.12666,-1.31742 14.97206,-6.41277 0.55169,0.0718 1.1521,0.0505 1.69641,0.49515 0.45839,1.67116 -0.34771,2.77114 -0.50064,4.33785 1.47008,-2.11891 2.39377,-3.82799 1.81562,-5.11852 -0.65544,-0.47646 -1.13239,-0.84126 -2.08564,-0.90614 0.2242,-2.22125 0.12343,-2.19897 -1.84772,-1.11119 -0.027,-0.0153 -0.054,-0.0308 -0.081,-0.0459 -0.13212,-2.312418 -0.19894,-2.346242 -1.90222,-1.01773 -0.39525,-2.304482 -0.46385,-2.285755 -2.08647,-0.69401 -0.78276,-2.275429 -0.83337,-2.248771 -2.2084,-0.374874 -1.38113,-1.916624 -1.4363,-1.886031 -2.19098,0.244914 -0.93375,-0.746434 -1.41465,-1.114437 -1.67661,-1.008099 z"
style="fill:#2a3455;fill-opacity:1;stroke:#cccccc;stroke-width:0.212762;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<path
id="path5389-8"
d="m 140.97831,108.89338 c -0.0997,0.0432 -0.1624,0.0807 -0.1486,0.0829 0,0 -0.80881,3.09385 1.59758,3.63486 a 2.0738233,1.7610569 15.019669 0 0 1.05807,1.73034 2.0738233,1.7610569 15.019669 0 0 2.39928,-0.0919 l -1.40796,-1.39467 1.86476,-0.61321 a 2.0738233,1.7610569 15.019669 0 0 -2.1123,-1.16933 2.0738233,1.7610569 15.019669 0 0 -1.37407,0.57883 c -0.47768,-0.11421 -1.31374,-0.58513 -1.03548,-2.44396 0.0921,-0.61507 -0.54189,-0.4424 -0.84131,-0.31396 z"
style="fill:#2a3455;fill-opacity:1;stroke:#cccccc;stroke-width:0.212762;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<path
id="path5732-7"
d="m 151.16542,99.348723 c -0.31065,0.459014 -0.45239,1.035767 -0.39183,1.594317 0.0815,0.73897 0.505,1.34373 1.10549,1.57849 0.10244,2.21135 -1.43246,2.11407 -1.46989,2.10013 -0.28634,-0.0774 -0.71677,1.13867 0.53519,0.98198 1.95562,-0.24473 2.05537,-2.12623 1.98064,-3.063 0.49633,-0.1651 0.92044,-0.56676 1.16438,-1.10276 0.36766,-0.81095 0.25745,-1.774612 -0.27281,-2.385521 l -1.28437,1.509221 -0.10531,-0.25395 z"
style="fill:#2a3455;fill-opacity:1;stroke:#cccccc;stroke-width:0.212762;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<path
style="fill:#b1b3b8;fill-opacity:1;stroke:#b1b3b8;stroke-width:0.165543;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 157.03788,77.939189 c -0.10179,0.05 1.49878,1.067004 1.15909,-0.658823 -0.0229,-0.116239 -0.27783,0.726935 -1.15909,0.658823 z"
id="path5399-5"
inkscape:label="kani-passport-smile"
transform="matrix(1.1463308,0.13595947,-0.13595947,1.1463308,-22.801274,-2.4500009)" />
<g
id="g364"
inkscape:label="kani-passport-eye-left"
transform="matrix(1.1463308,0.13595947,-0.13595947,1.1463308,-22.801274,-2.4500009)">
<path
style="fill:#b1b3b8;fill-opacity:1;stroke:#b1b3b8;stroke-width:0.0438px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 155.39466,76.994381 c 0.20359,1.997829 2.04911,1.617431 0.97679,0.211015 -0.32445,-0.440244 -0.93981,-0.822131 -0.97679,-0.211015 z"
id="path5415-5" />
<path
style="fill:#ffffff;stroke:#ffffff;stroke-width:0.0438px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 155.77699,76.930181 c -0.0393,0.316333 0.31396,0.552158 0.32421,0.574809 0.37728,0.09117 -0.17566,-0.814887 -0.32421,-0.574809 z"
id="path5417-5" />
</g>
<g
id="g374"
inkscape:label="kani-passport-eye-right"
transform="matrix(1.1463308,0.13595947,-0.13595947,1.1463308,-22.801274,-2.4500009)">
<path
id="path5433-8"
d="m 157.72622,75.602125 c 0.20358,1.997831 2.04911,1.617429 0.97679,0.211012 -0.32445,-0.440244 -0.93981,-0.82213 -0.97679,-0.211012 z"
style="fill:#b1b3b8;fill-opacity:1;stroke:#b1b3b8;stroke-width:0.0438px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
<path
id="path5435-2"
d="m 158.10855,75.537924 c -0.0393,0.316333 0.31396,0.552158 0.32421,0.574808 0.37728,0.09117 -0.17566,-0.814886 -0.32421,-0.574808 z"
style="fill:#ffffff;stroke:#ffffff;stroke-width:0.0438px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
</g>
</g>
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:1.71585px;line-height:1.25;font-family:sans-serif;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.0428963"
x="94.641426"
y="157.04494"
id="text167"
transform="rotate(-28.988077,144.6719,16.286147)"
inkscape:transform-center-x="-0.79526083"
inkscape:transform-center-y="0.17672463"
inkscape:label="PASSPORT"><tspan
sodipodi:role="line"
id="tspan165"
x="94.641426"
y="157.04494"
style="fill:#cccccc;stroke-width:0.0428963">PASSPORT</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:2.03519px;line-height:1.25;font-family:sans-serif;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.0508798"
x="92.063805"
y="154.54707"
id="text163"
transform="rotate(-29.037466,144.42409,16.321288)"
inkscape:transform-center-x="0.53242986"
inkscape:transform-center-y="0.81914073"
inkscape:label="AUTHSTRALIA"><tspan
sodipodi:role="line"
id="tspan161"
x="92.063805"
y="154.54707"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:'.PingFang SC';-inkscape-font-specification:'.PingFang SC';fill:#cccccc;stroke-width:0.0508798">AUTHSTRALIA</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:2.70471px;line-height:1.25;font-family:sans-serif;fill:#cccccc;fill-opacity:1;stroke:none;stroke-width:0.0676183"
x="93.162766"
y="128.62389"
id="text1127"
transform="rotate(-29.176231,143.73222,16.419399)"
inkscape:label="KANIDM"><tspan
sodipodi:role="line"
id="tspan1125"
x="93.162766"
y="128.62389"
style="fill:#cccccc;stroke-width:0.0676183">KANIDM</tspan></text>
</g>
<path
d="m 145.61485,98.730679 c 3.50932,-3.1137 4.19635,-7.01138 3.17635,-11.38324 l -7.3914,3.83317 z"
style="display:inline;fill:#2a3455;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="path523"
inkscape:label="under-kani-claw" />
<path
id="path5732"
d="m 136.84733,83.996879 c -2.18137,1.42401 -3.84498,3.66555 -4.59874,6.19631 -0.99138,3.35068 -0.25622,6.742 1.91889,8.85192 -3.57942,9.769591 -10.05414,6.555411 -10.19096,6.426891 -1.10017,-0.85629 -5.17794,3.63047 0.53268,5.22929 8.92019,2.49747 12.77572,-5.47478 14.1562,-9.67038 2.45132,0.18756 5.02004,-0.78148 7.05239,-2.660471 3.06875,-2.84546 4.34444,-7.22212 3.15795,-10.83433 l -8.31186,4.20365 0.005,-1.29218 z"
style="display:inline;fill:#ff6600;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 16 KiB

View file

@ -1,14 +1,17 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
id="svg5800"
width="512"
height="512"
viewBox="0 0 135.46667 135.46666"
version="1.1"
viewBox="0 0 8.4666659 8.4666662"
height="32"
width="32"
id="svg1084"
sodipodi:docname="logo-square.svg"
inkscape:version="1.2 (dc2aeda, 2022-05-15)"
inkscape:export-xdpi="96.000008"
inkscape:export-ydpi="96.000008"
inkscape:export-filename="logo-180.png"
inkscape:export-xdpi="33.75"
inkscape:export-ydpi="33.75"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
@ -16,88 +19,110 @@
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:dc="http://purl.org/dc/elements/1.1/">
<title
id="title332">Kanidm Square Logo</title>
<sodipodi:namedview
id="namedview39"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1636"
inkscape:window-height="1273"
id="namedview108"
showgrid="false"
inkscape:zoom="16"
inkscape:cx="25.5625"
inkscape:cy="21.09375"
inkscape:window-x="2213"
inkscape:window-y="259"
inkscape:window-maximized="0"
inkscape:current-layer="layer1"
inkscape:pagecheckerboard="true"
inkscape:document-units="px"
units="px"
showguides="true"
inkscape:guide-bbox="true"
bordercolor="#000000"
borderopacity="0.25"
inkscape:showpageshadow="2"
inkscape:deskcolor="#d1d1d1">
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
showgrid="false"
showguides="true"
inkscape:zoom="1"
inkscape:cx="234.5"
inkscape:cy="304.5"
inkscape:window-width="1389"
inkscape:window-height="847"
inkscape:window-x="51"
inkscape:window-y="25"
inkscape:window-maximized="0"
inkscape:current-layer="svg1084">
<sodipodi:guide
position="0.26458331,8.4666661"
orientation="-1,0"
id="guide3487"
inkscape:label="LeftGutter"
position="-52.916665,67.733332"
orientation="0,1"
id="guide145"
inkscape:locked="false"
inkscape:color="rgb(0,0,255)" />
inkscape:label="vertical_middle"
inkscape:color="rgb(0,134,229)" />
<sodipodi:guide
position="8.2020827,8.4666661"
position="121.97292,175.15416"
orientation="-1,0"
id="guide3559"
inkscape:label="RightGutter"
id="guide777"
inkscape:locked="false"
inkscape:color="rgb(0,0,255)" />
inkscape:label=""
inkscape:color="rgb(0,134,229)" />
<sodipodi:guide
position="13.49375,173.03749"
orientation="-1,0"
id="guide779"
inkscape:locked="false"
inkscape:label=""
inkscape:color="rgb(0,134,229)" />
<sodipodi:guide
position="22.754166,121.97292"
orientation="0,1"
id="guide781"
inkscape:locked="false"
inkscape:label=""
inkscape:color="rgb(0,134,229)" />
<sodipodi:guide
position="4.4979168,13.758333"
orientation="0,1"
id="guide783"
inkscape:locked="false"
inkscape:label=""
inkscape:color="rgb(0,134,229)" />
</sodipodi:namedview>
<defs
id="defs5794" />
id="defs1081" />
<metadata
id="metadata5797">
id="metadata330">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title>Kanidm Square Logo</dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<rect
style="fill:#ffffff;stroke-width:0.243721"
id="rect443"
width="135.46666"
height="135.46666"
x="0"
y="0"
inkscape:label="background"
sodipodi:insensitive="true" />
<g
inkscape:groupmode="layer"
id="layer3"
id="layer1"
transform="matrix(0.91407203,0,0,0.91407203,-34.121105,-24.362694)"
inkscape:label="kani">
<path
style="fill:#803300;stroke:#000000;stroke-width:0.0738318;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="M 6.8236027,5.6214477 C 7.0727468,6.219438 6.3950073,6.7706755 6.3921002,6.7795817 6.5158926,6.4189258 6.6467266,6.1277845 6.4061022,5.8757083"
id="path5404"
d="m 62.537712,110.23377 c -3.36297,8.12708 5.78522,15.61876 5.82446,15.73981 -1.67096,-4.90156 -3.43697,-8.85836 -0.189,-12.28424"
style="display:inline;fill:#803300;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<path
style="display:inline;fill:#803300;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 138.4423,109.69923 c 3.36297,8.12708 -5.78522,15.61876 -5.82446,15.7398 1.67096,-4.90155 3.43697,-8.85835 0.189,-12.28423"
id="path5408" />
<path
id="path5404"
d="M 1.2663952,5.6607791 C 1.017251,6.2587694 1.6949906,6.810007 1.6978977,6.8189139 1.5741055,6.4582572 1.4432714,6.167116 1.6838958,5.9150398"
style="fill:#803300;stroke:#000000;stroke-width:0.0738318;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<path
id="path4529"
d="M 4.1262147,2.4952519 C 4.0292655,2.4941071 3.9364931,2.6683689 3.7638923,3.0093297 3.2414578,2.4386605 3.2147347,2.4317515 3.0347307,3.2043142 c -0.00842,0.0035 -0.016823,0.00705 -0.025229,0.010643 C 2.3514594,2.8231912 2.3174598,2.8201269 2.367398,3.5859179 2.3514185,3.5976914 2.335452,3.6096168 2.3195424,3.6217364 1.6452247,3.356438 1.6160687,3.3731547 1.7867025,4.1082086 1.7787132,4.1167961 1.770701,4.1253409 1.7627361,4.134027 1.0754648,3.949608 1.0562353,3.977319 1.3125518,4.6975356 1.3015525,4.7132045 1.290639,4.7291433 1.2797042,4.745027 0.50506248,4.6627831 0.48914912,4.6778095 0.88296405,5.3946204 c -0.001926,0.00354 -0.003896,0.00693 -0.005823,0.01049 C 0.55977688,5.5557937 0.45471315,5.7394485 0.30433189,5.9859621 0.29265912,6.4748694 0.81954545,6.8962235 1.5771307,7.3750747 1.3168531,6.8959735 0.90982489,6.6531028 0.83173607,6.0588526 0.94609816,5.8450749 1.1405778,5.7712278 1.3075711,5.6750433 3.1315289,6.7322513 5.0574175,6.7445068 6.9788084,5.6345485 7.1462505,5.7313085 7.3418856,5.8048928 7.4567107,6.0195366 7.3786219,6.6137861 6.9715555,6.8566192 6.7112779,7.3357204 7.4688628,6.8568694 7.9957876,6.4355526 7.9841149,5.9466454 7.837906,5.7069711 7.7339485,5.526798 7.4366502,5.3784984 7.8080292,4.7002197 7.7726761,4.693836 6.9932037,4.7768143 6.9866028,4.768338 6.9800203,4.759754 6.9734105,4.7513387 7.2426835,3.9962954 7.2257907,3.9765642 6.4998724,4.1721643 6.683597,3.3844248 6.6590462,3.3812124 5.9235414,3.6715469 5.9789426,2.8411956 5.9590968,2.8429202 5.265052,3.2563684 5.0799777,2.4603237 5.058139,2.4626925 4.5286165,3.0411552 4.3294434,2.6781384 4.2246516,2.4964146 4.126211,2.4952519 Z"
style="fill:#ff6600;stroke:#000000;stroke-width:0.0738318;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<path
id="path5389"
d="m 2.2144388,5.4099987 c -0.037814,2.942e-4 -0.063022,0.004 -0.058881,0.00655 0,0 -0.6766928,0.8782586 0.022971,1.3729146 A 0.72030748,0.61055214 36.636339 0 0 2.2849976,7.4828565 0.72030748,0.61055214 36.636339 0 0 3.0676808,7.7747629 L 2.803634,7.1415518 3.4849785,7.1956595 A 0.72030748,0.61055214 36.636339 0 0 2.9644271,6.54002 0.72030748,0.61055214 36.636339 0 0 2.4452544,6.5406823 C 2.307286,6.4403184 2.1023393,6.1782303 2.4422318,5.6227566 2.5546974,5.4389575 2.3278831,5.4091436 2.2144404,5.4100156 Z"
style="fill:#ff6600;fill-opacity:1;stroke:#000000;stroke-width:0.0738318;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
d="m 100.24698,67.21217 c -1.308628,-0.01556 -2.560878,2.352773 -4.890668,6.986654 -7.05187,-7.755768 -7.41258,-7.849666 -9.84229,2.649966 -0.11364,0.04758 -0.22709,0.0959 -0.34055,0.144695 -8.88231,-5.324406 -9.34124,-5.366051 -8.66717,5.041551 -0.21569,0.159933 -0.43121,0.322088 -0.64596,0.486794 -9.102,-3.605578 -9.49555,-3.378386 -7.19232,6.611477 -0.10784,0.11671 -0.21599,0.23284 -0.3235,0.35089 -9.27685,-2.506375 -9.53641,-2.129764 -6.07663,7.65845 -0.14847,0.21295 -0.29578,0.42957 -0.44338,0.64544 -10.45618,-1.11775 -10.67098,-0.91353 -5.35523,8.828413 -0.026,0.0482 -0.0526,0.0943 -0.0786,0.14263 -4.28381,2.04782 -5.70197,4.54381 -7.73183,7.89409 -0.15756,6.64457 6.9544,12.37105 17.18035,18.87895 -3.51325,-6.5113 -9.00735,-9.81207 -10.0614,-17.88832 1.54367,-2.90538 4.16877,-3.90901 6.42286,-5.21622 24.61995,14.36815 50.615808,14.53471 76.550928,-0.55035 2.26015,1.31503 4.90084,2.31509 6.45076,5.23224 -1.05405,8.07624 -6.54866,11.3765 -10.06191,17.8878 10.22594,-6.5079 17.33842,-12.23387 17.18086,-18.87844 -1.97354,-3.25733 -3.37677,-5.706 -7.38973,-7.72149 5.01291,-9.218263 4.53571,-9.305023 -5.98567,-8.177293 -0.0891,-0.1152 -0.17795,-0.23186 -0.26717,-0.34623 3.63467,-10.261532 3.40665,-10.529692 -6.39186,-7.87136 2.47993,-10.705895 2.14854,-10.749554 -7.77938,-6.803718 0.74781,-11.285018 0.47993,-11.261581 -8.88835,-5.642548 -2.49815,-10.818768 -2.79293,-10.786576 -9.94048,-2.924887 -2.68846,-4.933638 -4.10296,-7.403383 -5.43173,-7.419184 z"
style="display:inline;fill:#ff6600;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<g
id="g5758"
transform="matrix(0.07408455,0,0,0.07357997,-3.6046589,-3.0058747)">
transform="translate(-2.3193819,-7.5517449)"
style="display:inline">
<path
style="fill:#d45500;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
style="display:inline;fill:#d45500;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 98.808992,121.55238 c -0.682767,-0.0559 4.468828,10.17565 8.051908,0.17277 0.24133,-0.67372 -3.69223,2.90976 -8.051908,-0.17277 z"
id="path5399" />
<g
id="g351">
<path
style="fill:#000000;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 93.212672,111.5632 c -5.131386,10.99206 5.618332,14.73472 4.412511,4.11951 -0.319289,-3.2881 -2.328089,-7.17448 -4.412511,-4.11951 z"
@ -106,6 +131,9 @@
style="fill:#ffffff;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 95.394393,112.41429 c -1.183441,1.51896 -0.08172,3.83605 -0.09872,3.98526 1.674403,1.64132 1.61267,-4.77034 0.09872,-3.98526 z"
id="path5417" />
</g>
<g
id="g355">
<path
id="path5433"
d="m 109.6169,111.5632 c -5.13141,10.99206 5.61836,14.73472 4.41254,4.11951 -0.31929,-3.2881 -2.3281,-7.17448 -4.41254,-4.11951 z"
@ -113,49 +141,29 @@
<path
id="path5435"
d="m 111.79864,112.41429 c -1.18345,1.51896 -0.0817,3.83605 -0.0987,3.98526 1.67441,1.64132 1.61267,-4.77034 0.0987,-3.98526 z"
style="fill:#ffffff;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
style="display:inline;fill:#ffffff;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
</g>
</g>
<path
id="path5389"
d="m 75.334492,106.8255 c -0.51041,0.004 -0.85068,0.0544 -0.79478,0.0889 0,0 -9.13406,11.93611 0.31006,18.65881 a 9.7471106,8.2770874 37.793943 0 0 1.43712,9.42372 9.7471106,8.2770874 37.793943 0 0 10.56473,3.9672 l -3.56412,-8.60569 9.19685,0.73536 a 9.7471106,8.2770874 37.793943 0 0 -7.02645,-8.91057 9.7471106,8.2770874 37.793943 0 0 -7.00784,0.009 c -1.86231,-1.36401 -4.6287,-4.92596 -0.0408,-12.47521 1.51807,-2.49795 -1.54349,-2.90314 -3.07475,-2.89129 z"
style="display:inline;fill:#ff6600;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<g
inkscape:groupmode="layer"
id="layer1"
inkscape:label="passport"
transform="translate(-12.063571,-65.570169)"
id="g5751"
style="display:inline">
<path
style="display:inline;opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 142.55119,137.92594 27.3632,-15.27364 21.39613,38.33184 -27.36321,15.27364 z"
id="path5730" />
<path
id="path5734"
d="M 4.4727876,3.2860988 5.0865919,1.0623464 8.2231056,1.9163406 7.6093007,4.1400935 6.6899943,3.8897392 C 6.7076906,3.5449842 6.537409,3.3079137 6.2534312,3.1359748 L 6.0721688,3.7215707 Z"
style="fill:#2a3455;fill-opacity:1;stroke:#000000;stroke-width:0.0738318;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:0.166237px;line-height:1.25;font-family:sans-serif;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.00415594"
x="-1.3283145"
y="7.929297"
id="text163"
transform="rotate(-74.037466)"
inkscape:transform-center-x="-0.016559599"
inkscape:transform-center-y="0.078066045"><tspan
sodipodi:role="line"
id="tspan161"
x="-1.3283145"
y="7.929297"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:'.PingFang SC';-inkscape-font-specification:'.PingFang SC';fill:#cccccc;stroke-width:0.00415594">AUTHSTRALIA</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:0.140154px;line-height:1.25;font-family:sans-serif;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.00350384"
x="-1.1218139"
y="8.1409359"
id="text167"
transform="rotate(-73.988078)"
inkscape:transform-center-x="-0.056139824"
inkscape:transform-center-y="-0.035726887"><tspan
sodipodi:role="line"
id="tspan165"
x="-1.1218139"
y="8.1409359"
style="fill:#cccccc;stroke-width:0.00350384">PASSPORT</tspan></text>
d="m 142.55119,137.92594 27.3632,-15.27364 21.39613,38.33184 -27.36321,15.27364 -6.27068,-11.23547 c 3.50932,-3.1137 4.19635,-7.01138 3.17635,-11.38324 l -7.39141,3.83317 z"
style="display:inline;opacity:1;fill:#2a3455;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<g
id="g1027"
transform="matrix(0.04379293,-0.05557881,0.05557881,0.04379293,-5.8120093,6.0560959)">
transform="matrix(0.86024749,-0.10202883,0.10202883,0.86024749,30.096406,71.933538)"
style="display:inline">
<path
id="path4529-1"
d="m 142.60294,99.070411 c -0.25799,0.104739 -0.3086,0.672471 -0.384,1.773409 -2.02218,-0.940695 -2.10067,-0.929408 -1.71256,1.33048 -0.0183,0.0187 -0.0366,0.0375 -0.0549,0.0564 -2.18101,-0.31296 -2.27447,-0.28333 -1.28505,1.70286 -0.0291,0.0491 -0.0581,0.0987 -0.0866,0.1487 -2.08254,0.0423 -2.14104,0.11931 -0.86643,1.88938 -0.0116,0.0318 -0.0232,0.0635 -0.0346,0.0955 -2.02632,0.27237 -2.04621,0.36762 -0.56133,2.00288 -0.0116,0.054 -0.0226,0.10863 -0.0338,0.16313 -2.1433,0.64191 -2.16862,0.69967 -0.32345,2.17298 -0.001,0.0115 -0.002,0.0228 -0.004,0.0345 -0.67172,0.75455 -0.74436,1.361 -0.86664,2.18542 0.51637,1.31647 2.38318,1.85412 4.92525,2.2886 -1.22549,-0.98801 -2.57514,-1.18304 -3.44709,-2.68058 0.0635,-0.6971 0.49586,-1.1102 0.83039,-1.55228 6.0132,0.79095 11.12666,-1.31742 14.97206,-6.41277 0.55169,0.0718 1.1521,0.0505 1.69641,0.49515 0.45839,1.67116 -0.34771,2.77114 -0.50064,4.33785 1.47008,-2.11891 2.39377,-3.82799 1.81562,-5.11852 -0.65544,-0.47646 -1.13239,-0.84126 -2.08564,-0.90614 0.2242,-2.22125 0.12343,-2.19897 -1.84772,-1.11119 -0.027,-0.0153 -0.054,-0.0308 -0.081,-0.0459 -0.13212,-2.312418 -0.19894,-2.346242 -1.90222,-1.01773 -0.39525,-2.304482 -0.46385,-2.285755 -2.08647,-0.69401 -0.78276,-2.275429 -0.83337,-2.248771 -2.2084,-0.374874 -1.38113,-1.916624 -1.4363,-1.886031 -2.19098,0.244914 -0.93375,-0.746434 -1.41465,-1.114437 -1.67661,-1.008099 z"
@ -168,26 +176,77 @@
id="path5732-7"
d="m 151.16542,99.348723 c -0.31065,0.459014 -0.45239,1.035767 -0.39183,1.594317 0.0815,0.73897 0.505,1.34373 1.10549,1.57849 0.10244,2.21135 -1.43246,2.11407 -1.46989,2.10013 -0.28634,-0.0774 -0.71677,1.13867 0.53519,0.98198 1.95562,-0.24473 2.05537,-2.12623 1.98064,-3.063 0.49633,-0.1651 0.92044,-0.56676 1.16438,-1.10276 0.36766,-0.81095 0.25745,-1.774612 -0.27281,-2.385521 l -1.28437,1.509221 -0.10531,-0.25395 z"
style="fill:#2a3455;fill-opacity:1;stroke:#cccccc;stroke-width:0.212762;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<path
style="fill:#b1b3b8;fill-opacity:1;stroke:#b1b3b8;stroke-width:0.165543;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 157.03788,77.939189 c -0.10179,0.05 1.49878,1.067004 1.15909,-0.658823 -0.0229,-0.116239 -0.27783,0.726935 -1.15909,0.658823 z"
id="path5399-5"
transform="matrix(1.1463308,0.13595947,-0.13595947,1.1463308,-22.801274,-2.4500009)" />
<g
id="g364"
transform="matrix(1.1463308,0.13595947,-0.13595947,1.1463308,-22.801274,-2.4500009)">
<path
style="fill:#b1b3b8;fill-opacity:1;stroke:#b1b3b8;stroke-width:0.0438px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 155.39466,76.994381 c 0.20359,1.997829 2.04911,1.617431 0.97679,0.211015 -0.32445,-0.440244 -0.93981,-0.822131 -0.97679,-0.211015 z"
id="path5415-5" />
<path
style="fill:#ffffff;stroke:#ffffff;stroke-width:0.0438px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 155.77699,76.930181 c -0.0393,0.316333 0.31396,0.552158 0.32421,0.574809 0.37728,0.09117 -0.17566,-0.814887 -0.32421,-0.574809 z"
id="path5417-5" />
</g>
<g
id="g374"
transform="matrix(1.1463308,0.13595947,-0.13595947,1.1463308,-22.801274,-2.4500009)">
<path
id="path5433-8"
d="m 157.72622,75.602125 c 0.20358,1.997831 2.04911,1.617429 0.97679,0.211012 -0.32445,-0.440244 -0.93981,-0.82213 -0.97679,-0.211012 z"
style="fill:#b1b3b8;fill-opacity:1;stroke:#b1b3b8;stroke-width:0.0438px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
<path
id="path5435-2"
d="m 158.10855,75.537924 c -0.0393,0.316333 0.31396,0.552158 0.32421,0.574808 0.37728,0.09117 -0.17566,-0.814886 -0.32421,-0.574808 z"
style="fill:#ffffff;stroke:#ffffff;stroke-width:0.0438px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
</g>
</g>
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:0.220925px;line-height:1.25;font-family:sans-serif;fill:#cccccc;fill-opacity:1;stroke:none;stroke-width:0.00552317"
x="-1.2271552"
y="5.7904234"
style="font-style:normal;font-weight:normal;font-size:1.71585px;line-height:1.25;font-family:sans-serif;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.0428963"
x="94.641426"
y="157.04494"
id="text167"
transform="rotate(-28.988077,144.6719,16.286147)"><tspan
id="tspan165"
x="94.641426"
y="157.04494"
style="fill:#cccccc;stroke-width:0.0428963">PASSPORT</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:2.03519px;line-height:1.25;font-family:sans-serif;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.0508798"
x="92.063805"
y="154.54707"
id="text163"
transform="rotate(-29.037466,144.42409,16.321288)"><tspan
id="tspan161"
x="92.063805"
y="154.54707"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:'.PingFang SC';-inkscape-font-specification:'.PingFang SC';fill:#cccccc;stroke-width:0.0508798">AUTHSTRALIA</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:2.70471px;line-height:1.25;font-family:sans-serif;fill:#cccccc;fill-opacity:1;stroke:none;stroke-width:0.0676183"
x="93.162766"
y="128.62389"
id="text1127"
transform="rotate(-74.176232)"><tspan
sodipodi:role="line"
transform="rotate(-29.176231,143.73222,16.419399)"><tspan
id="tspan1125"
x="-1.2271552"
y="5.7904234"
style="fill:#cccccc;stroke-width:0.00552317">KANIDM</tspan></text>
x="93.162766"
y="128.62389"
style="fill:#cccccc;stroke-width:0.0676183">KANIDM</tspan></text>
</g>
<path
style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.0738318;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="M 4.4727876,3.2860988 5.0865919,1.0623464 8.2231056,1.9163406 7.6093007,4.1400935 Z"
id="path5730" />
d="m 145.61485,98.730679 c 3.50932,-3.1137 4.19635,-7.01138 3.17635,-11.38324 l -7.3914,3.83317 z"
style="display:inline;fill:#2a3455;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="path523" />
<path
id="path5732"
d="M 5.4483222,3.5809313 C 5.4102971,3.768852 5.4423564,3.9717625 5.5369438,4.1418391 5.6625176,4.3666719 5.8798921,4.5029901 6.104328,4.497653 6.4346939,5.1893497 5.9286446,5.3633841 5.914749,5.3639364 5.8123739,5.377513 5.8377135,5.8229134 6.2187287,5.6056709 6.8138918,5.2663326 6.5928357,4.6528388 6.4428208,4.3640113 6.5800196,4.2450372 6.6622,4.0602516 6.6684455,3.856687 6.6774386,3.5488876 6.5124143,3.2562212 6.2599318,3.1321972 l -0.2094822,0.6530092 -0.06802,-0.066904 z"
style="display:inline;fill:#ff6600;fill-opacity:1;stroke:#000000;stroke-width:0.0738318;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
d="m 136.84733,83.996879 c -2.18137,1.42401 -3.84498,3.66555 -4.59874,6.19631 -0.99138,3.35068 -0.25622,6.742 1.91889,8.85192 -3.57942,9.769591 -10.05414,6.555411 -10.19096,6.426891 -1.10017,-0.85629 -5.17794,3.63047 0.53268,5.22929 8.92019,2.49747 12.77572,-5.47478 14.1562,-9.67038 2.45132,0.18756 5.02004,-0.78148 7.05239,-2.660471 3.06875,-2.84546 4.34444,-7.22212 3.15795,-10.83433 l -8.31186,4.20365 0.005,-1.29218 z"
style="display:inline;fill:#ff6600;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
</g>
</svg>

Before

Width:  |  Height:  |  Size: 13 KiB

After

Width:  |  Height:  |  Size: 16 KiB

View file

@ -27,24 +27,21 @@ and sensitive data), group management, and more.
## Recovering the Initial idm_admin Account
By default the idm_admin user has no password, and can not be accessed. You should recover it with the
admin (system admin) account. We recommend the use of the "recover_account" functionality as it provides a high strength, random password.
admin (system admin) account.
<table>
<tr>
<td>
<img src="/images/kani-warning.png" style="float:left">
</td>
<td>Warning: The server must not be running at this point, as it requires exclusive access to the database.</td>
</tr>
</table>
{{#template
templates/kani-warning.md
text=Warning: The server must not be running at this point, as it requires exclusive access to the database.
}}
We recommend the use of the "recover_account" functionality as it provides a high strength, random password.
```shell
kanidmd recover_account -c /etc/kanidm/server.toml -n idm_admin
Successfully recovered account 'idm_admin' - password reset to -> j9YUv...
```
To do this in Docker, you'll neeD to stop the existing container and run it with "bash" as the "command" argument, to get a shell, then run the `kanidmd` command above.
To do this in Docker, you'll need to stop the existing container and run it with `bash` as the "command" argument, to get a shell, then run the `kanidmd` command above.
For example, if I'm using the developer image in my test environment:

View file

@ -190,6 +190,7 @@ impl AccountOpt {
{
// TODO: JSON output for account person extend.
Ok(_) => {
result_output.status = kanidm_proto::messages::MessageStatus::Success;
result_output.result = format!(
"Successfully extended the user {}.",
aopt.aopts.account_id

View file

@ -0,0 +1,189 @@
///! Builds a Progressive Web App Manifest page.
// Thanks to the webmanifest crate for a lot of this code
use crate::https::{AppState, RequestExtensions};
use serde::{Deserialize, Serialize};
/// The MIME type for `.webmanifest` files.
const MIME_TYPE_MANIFEST: &str = "application/manifest+json";
/// Create a new manifest builder.
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Manifest<'s> {
name: &'s str,
short_name: &'s str,
start_url: &'s str,
#[serde(rename = "display")]
display_mode: DisplayMode,
background_color: &'s str,
#[serde(skip_serializing_if = "Option::is_none")]
description: Option<&'s str>,
#[serde(rename = "dir")]
direction: Direction,
// direction: Option<Direction>,
#[serde(skip_serializing_if = "Option::is_none")]
orientation: Option<String>,
// orientation: Option<Orientation>,
#[serde(skip_serializing_if = "Option::is_none")]
lang: Option<&'s str>,
#[serde(skip_serializing_if = "Option::is_none")]
scope: Option<&'s str>,
// #[serde(skip_serializing_if = "Option::is_none")]
theme_color: &'s str,
#[serde(skip_serializing_if = "Option::is_none")]
prefer_related_applications: Option<bool>,
// #[serde(borrow)]
// #[serde(skip_serializing_if = "Option::is_none")]
icons: Vec<ManifestIcon>,
// icons: Vec<Icon<'i>>,
// #[serde(borrow)]
#[serde(skip_serializing_if = "Option::is_none")]
related_applications: Option<Vec<String>>,
// related_applications: Vec<Related<'r>>,
}
#[derive(Clone, Debug, Serialize, Deserialize)]
struct ManifestIcon {
src: String,
#[serde(rename = "type")]
mime_type: String,
sizes: String,
#[serde(skip_serializing_if = "Option::is_none")]
purpose: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
enum Direction {
/// left-to-right
#[serde(rename = "ltr")]
Ltr,
/// right-to-left
#[serde(rename = "rtl")]
Rtl,
/// Hints to the browser to use the [Unicode bidirectional
/// algorithm](https://developer.mozilla.org/en-US/docs/Web/Localization/Unicode_Bidirectional_Text_Algorithm)
/// to make a best guess about the text's direction.
#[serde(rename = "auto")]
Auto,
}
/// Display modes from the Web app manifest definition
///
/// Ref: https://developer.mozilla.org/en-US/docs/Web/Manifest/display
#[derive(Debug, Clone, Serialize, Deserialize)]
enum DisplayMode {
/// All of the available display area is used and no user agent chrome is
/// shown.
#[serde(rename = "full-screen")]
FullScreen,
/// The application will look and feel like a standalone application. This can
/// include the application having a different window, its own icon in the
/// application launcher, etc. In this mode, the user agent will exclude UI
/// elements for controlling navigation, but can include other UI elements
/// such as a status bar.
#[serde(rename = "standalone")]
Standalone,
/// The application will look and feel like a standalone application, but will
/// have a minimal set of UI elements for controlling navigation. The elements
/// will vary by browser.
#[serde(rename = "minimal-ui")]
MinimalUi,
/// The application opens in a conventional browser tab or new window,
/// depending on the browser and platform. This is the default.
#[serde(rename = "browser")]
Browser,
}
/// Generates a manifest.json file for progressive web app usag
pub async fn manifest(req: tide::Request<AppState>) -> tide::Result {
let mut res = tide::Response::new(200);
let (eventid, _) = req.new_eventid();
let domain_display_name = req.state().qe_r_ref.get_domain_display_name(eventid).await;
let icons = vec![
ManifestIcon {
sizes: String::from("512x512"),
src: String::from("/pkg/img/logo-square.svg"),
mime_type: String::from("image/svg+xml"),
purpose: None,
},
ManifestIcon {
sizes: String::from("512x512"),
src: String::from("/pkg/img/logo-512.png"),
mime_type: String::from("image/png"),
purpose: Some(String::from("maskable")),
},
ManifestIcon {
sizes: String::from("192x192"),
src: String::from("/pkg/img/logo-192.png"),
mime_type: String::from("image/png"),
purpose: Some(String::from("maskable")),
},
ManifestIcon {
sizes: String::from("256x156"),
src: String::from("/pkg/img/logo-256.png"),
mime_type: String::from("image/png"),
purpose: Some(String::from("maskable")),
},
];
let manifest_struct = Manifest {
short_name: domain_display_name.as_str(),
name: domain_display_name.as_str(),
start_url: "/", // TODO: this needs to be the frontend URL, can't get this yet
display_mode: DisplayMode::MinimalUi,
description: None,
orientation: None,
lang: Some("en"),
theme_color: "white",
background_color: "white",
direction: Direction::Auto,
scope: None,
prefer_related_applications: None,
icons,
related_applications: None,
};
let manifest_string = serde_json::to_string_pretty(&manifest_struct)?;
res.set_content_type(MIME_TYPE_MANIFEST);
res.set_body(manifest_string);
Ok(res)
}
// "start_url": "/?source=pwa",
// "background_color": "#3367D6",
// "display": "standalone",
// "scope": "/",
// "theme_color": "#3367D6",
// "shortcuts": [
// {
// "name": "How's weather today?",
// "short_name": "Today",
// "description": "View weather information for today",
// "url": "/today?source=pwa",
// "icons": [{ "src": "/images/today.png", "sizes": "192x192" }]
// },
// {
// "name": "How's weather tomorrow?",
// "short_name": "Tomorrow",
// "description": "View weather information for tomorrow",
// "url": "/tomorrow?source=pwa",
// "icons": [{ "src": "/images/tomorrow.png", "sizes": "192x192" }]
// }
// ],
// "description": "Weather forecast information",
// "screenshots": [
// {
// "src": "/images/screenshot1.png",
// "type": "image/png",
// "sizes": "540x720"
// },
// {
// "src": "/images/screenshot2.jpg",
// "type": "image/jpg",
// "sizes": "540x720"
// }
// ]
// }

View file

@ -1,48 +1,7 @@
///! Middleware for the tide web server
//TODO: decide if this is still needed
// #[derive(Default)]
// /// Injects the domain_display_name where it needs to
// pub struct KanidmDisplayNameMiddleware {
// domain_display_name: String,
// }
// // // TODO: finish this for #860
// // #[async_trait::async_trait]
// // impl<State: Clone + Send + Sync + 'static> tide::Middleware<State> for KanidmDisplayNameMiddleware {
// // async fn handle(
// // &self,
// // request: tide::Request<State>,
// // next: tide::Next<'_, State>,
// // ) -> tide::Result {
// // let mut response = next.run(request).await;
// // // grab the body we're intending to return at this point
// // let body_str = response.take_body().into_string().await?;
// // // update it with the hash
// // // TODO: #860 make this a const so we can change it and not typo it later
// // response.set_body(body_str.replace(
// // "===DOMAIN_DISPLAY_NAME===",
// // self.domain_display_name.as_str(),
// // ));
// // Ok(response)
// // }
// // }
// impl KanidmDisplayNameMiddleware {
// /// Pulls the domain_display_name from the qs on web server start, so we can
// /// set it in pages
// pub fn new(domain_display_name: String) -> Self {
// KanidmDisplayNameMiddleware {
// // TODO: #860 work out how to get this out :D
// domain_display_name: domain_display_name,
// }
// }
// }
#[derive(Default)]
/// This tide MiddleWare adds headers like Content-Security-Policy
/// and similar families. If it keeps adding more things then
/// probably rename the middlewre :)
/// probably rename the middleware :)
pub struct UIContentSecurityPolicyResponseMiddleware {
// The sha384 hash of /pkg/wasmloader.js
pub integrity_wasmloader: String,

View file

@ -1,30 +1,29 @@
mod manifest;
mod middleware;
mod oauth2;
mod v1;
use self::manifest::manifest;
use self::middleware::*;
use self::oauth2::*;
use self::v1::*;
use compact_jwt::{Jws, JwsSigner, JwsUnverified, JwsValidator};
use kanidm::actors::v1_read::QueryServerReadV1;
use kanidm::actors::v1_write::QueryServerWriteV1;
use kanidm::config::{ServerRole, TlsConfiguration};
use kanidm::prelude::*;
use kanidm::status::StatusActor;
use kanidm::tracing_tree::TreeMiddleware;
use regex::Regex;
use serde::Serialize;
use std::fs::canonicalize;
use std::path::PathBuf;
use std::str::FromStr;
use uuid::Uuid;
use kanidm::tracing_tree::TreeMiddleware;
use tide_compress::CompressMiddleware;
use tide_openssl::TlsListener;
use tracing::{error, info};
use compact_jwt::{Jws, JwsSigner, JwsUnverified, JwsValidator};
use uuid::Uuid;
#[derive(Clone)]
pub struct AppState {
@ -183,36 +182,65 @@ pub fn to_tide_response<T: Serialize>(
})
}
// Handle the various end points we need to expose
/// Returns a generic robots.txt
async fn robots_txt(_req: tide::Request<AppState>) -> tide::Result {
let mut res = tide::Response::new(200);
res.set_content_type("text/plain");
res.set_body(
r#"
User-agent: *
Disallow: /
"#,
);
Ok(res)
}
/// The web UI at / for Kanidm
async fn index_view(req: tide::Request<AppState>) -> tide::Result {
let mut res = tide::Response::new(200);
let (eventid, hvalue) = req.new_eventid();
let domain_display_name = req.state().qe_r_ref.get_domain_display_name(eventid).await;
let mut res = tide::Response::new(200);
res.insert_header("X-KANIDM-OPID", hvalue);
res.set_content_type("text/html;charset=utf-8");
res.set_body(format!(r#"
<!DOCTYPE html>
<html lang="en">
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8"/>
<meta name="viewport" content="width=device-width">
<meta name="theme-color" content="white" />
<meta name="viewport" content="width=device-width" />
<title>{}</title>
<link rel="stylesheet" href="/pkg/external/bootstrap.min.css" integrity="sha384-EVSTQN3/azprG1Anm3QDgpJLIm9Nao0Yz1ztcQTwFspd3yD65VohhpuuCOmLASjC"/>
<link rel="stylesheet" href="/pkg/style.css"/>
<script src="/pkg/external/bootstrap.bundle.min.js" integrity="sha384-MrcW6ZMFYlzcLA8Nl+NtUVF0sA7MsXsP1UyJoMp4YLEuNSfAP+JcXn/tWtIaxVXM"></script>
<script type="module" type="text/javascript" src="/pkg/wasmloader.js" integrity="sha384-==WASMHASH==">
</script>
<link rel="icon" href="/pkg/img/favicon.png" />
<link rel="manifest" href="/manifest.webmanifest" />
<link rel="apple-touch-icon" href="/pkg/img/logo-256.png" />
<link rel="apple-touch-icon" sizes="180x180" href="/pkg/img/logo-180.png" />
<link rel="apple-touch-icon" sizes="192x192" href="/pkg/img/logo-192.png" />
<link rel="apple-touch-icon" sizes="512x512" href="/pkg/img/logo-square.svg" />
<link rel="stylesheet" href="/pkg/external/bootstrap.min.css" integrity="sha384-EVSTQN3/azprG1Anm3QDgpJLIm9Nao0Yz1ztcQTwFspd3yD65VohhpuuCOmLASjC"/>
<link rel="stylesheet" href="/pkg/style.css"/>
<script src="/pkg/external/bootstrap.bundle.min.js" integrity="sha384-MrcW6ZMFYlzcLA8Nl+NtUVF0sA7MsXsP1UyJoMp4YLEuNSfAP+JcXn/tWtIaxVXM"></script>
<script type="module" type="text/javascript" src="/pkg/wasmloader.js" integrity="sha384-==WASMHASH=="></script>
</head>
<body>
<body class="flex-column d-flex h-100">
<main class="flex-shrink-0 form-signin">
<center>
<img src="/pkg/img/logo-square.svg" alt="Kanidm" class="kanidm_logo"/>
<h3>Kanidm is loading, please wait... </h3>
</center>
</main>
<footer class="footer mt-auto py-3 bg-light text-end">
<div class="container">
<span class="text-muted">Powered by <a href="https://kanidm.com">Kanidm</a></span>
</div>
</footer>
</body>
</html>
"#, domain_display_name.as_str())
</html>"#, domain_display_name.as_str()
)
);
Ok(res)
@ -448,6 +476,8 @@ pub fn create_https_server(
static_tserver.with(compress_middleware.clone());
static_tserver.at("/").get(index_view);
static_tserver.at("/robots.txt").get(robots_txt);
static_tserver.at("/manifest.webmanifest").get(manifest);
static_tserver.at("/ui/").get(index_view);
static_tserver.at("/ui/*").get(index_view);
@ -749,9 +779,6 @@ pub fn create_https_server(
let tlsl = TlsListener::new(address, x_ref);
*/
// adds Content-Security-Policy Headers when running in HTTPS
// TODO: make this only apply to /ui/
tokio::spawn(async move {
if let Err(e) = tserver.listen(tlsl).await {
error!(

View file

@ -7,8 +7,8 @@ fi
wasm-pack build ${BUILD_FLAGS} --target web || exit 1
touch ./pkg/ANYTHING_HERE_WILL_BE_DELETED_ADD_TO_SRC && \
rsync --delete-after -av ./src/img/ ./pkg/img/ && \
rsync --delete-after -av ./src/external/ ./pkg/external/ && \
rsync --delete-after -r --copy-links -v ./src/img/ ./pkg/img/ && \
rsync --delete-after -r --copy-links -v ./src/external/ ./pkg/external/ && \
cp ./src/style.css ./pkg/style.css && \
cp ./src/wasmloader.js ./pkg/wasmloader.js && \
rm ./pkg/.gitignore

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 48 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 798 KiB

After

Width:  |  Height:  |  Size: 16 KiB

View file

@ -12,9 +12,9 @@ export interface InitOutput {
readonly __wbindgen_malloc: (a: number) => number;
readonly __wbindgen_realloc: (a: number, b: number, c: number) => number;
readonly __wbindgen_export_2: WebAssembly.Table;
readonly _dyn_core__ops__function__FnMut___A____Output___R_as_wasm_bindgen__closure__WasmClosure___describe__invoke__hab3be56b8155b388: (a: number, b: number, c: number) => void;
readonly _dyn_core__ops__function__Fn__A____Output___R_as_wasm_bindgen__closure__WasmClosure___describe__invoke__h17af29331a011f5b: (a: number, b: number, c: number) => void;
readonly _dyn_core__ops__function__FnMut__A____Output___R_as_wasm_bindgen__closure__WasmClosure___describe__invoke__h67ec72bbd39c79bf: (a: number, b: number, c: number) => void;
readonly _dyn_core__ops__function__Fn__A____Output___R_as_wasm_bindgen__closure__WasmClosure___describe__invoke__h8142cf0979e67d24: (a: number, b: number, c: number) => void;
readonly _dyn_core__ops__function__FnMut__A____Output___R_as_wasm_bindgen__closure__WasmClosure___describe__invoke__hfed1f3471f1b926f: (a: number, b: number, c: number) => void;
readonly _dyn_core__ops__function__FnMut___A____Output___R_as_wasm_bindgen__closure__WasmClosure___describe__invoke__h3b7aa7dd2123cac1: (a: number, b: number, c: number) => void;
readonly __wbindgen_add_to_stack_pointer: (a: number) => number;
readonly __wbindgen_free: (a: number, b: number) => void;
readonly __wbindgen_exn_store: (a: number) => void;

File diff suppressed because it is too large Load diff

View file

@ -5,9 +5,9 @@ export function run_app(a: number): void;
export function __wbindgen_malloc(a: number): number;
export function __wbindgen_realloc(a: number, b: number, c: number): number;
export const __wbindgen_export_2: WebAssembly.Table;
export function _dyn_core__ops__function__FnMut___A____Output___R_as_wasm_bindgen__closure__WasmClosure___describe__invoke__hab3be56b8155b388(a: number, b: number, c: number): void;
export function _dyn_core__ops__function__Fn__A____Output___R_as_wasm_bindgen__closure__WasmClosure___describe__invoke__h17af29331a011f5b(a: number, b: number, c: number): void;
export function _dyn_core__ops__function__FnMut__A____Output___R_as_wasm_bindgen__closure__WasmClosure___describe__invoke__h67ec72bbd39c79bf(a: number, b: number, c: number): void;
export function _dyn_core__ops__function__Fn__A____Output___R_as_wasm_bindgen__closure__WasmClosure___describe__invoke__h8142cf0979e67d24(a: number, b: number, c: number): void;
export function _dyn_core__ops__function__FnMut__A____Output___R_as_wasm_bindgen__closure__WasmClosure___describe__invoke__hfed1f3471f1b926f(a: number, b: number, c: number): void;
export function _dyn_core__ops__function__FnMut___A____Output___R_as_wasm_bindgen__closure__WasmClosure___describe__invoke__h3b7aa7dd2123cac1(a: number, b: number, c: number): void;
export function __wbindgen_add_to_stack_pointer(a: number): number;
export function __wbindgen_free(a: number, b: number): void;
export function __wbindgen_exn_store(a: number): void;

View file

@ -19,9 +19,8 @@ body {
}
.form-signin {
width: 100%;
max-width: 330px;
padding: 15px;
/* width: 100%; */
max-width: 680px;
margin: auto;
}

View file

@ -150,7 +150,9 @@ impl Component for CredentialResetApp {
let next_state = match (msg, &self.state) {
(Msg::Ignore, _) => None,
(Msg::TokenSubmit, State::TokenInput) => {
let token = utils::get_value_from_element_id("autofocus").expect("No token");
#[allow(clippy::expect_used)]
let token = utils::get_value_from_element_id("autofocus")
.expect("Unable to find autofocus element");
ctx.link().send_future(async {
match Self::exchange_intent_token(token).await {

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 48 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 798 KiB

After

Width:  |  Height:  |  Size: 32 B

View file

@ -0,0 +1 @@
../../../artwork/logo-square.svg

Before

Width:  |  Height:  |  Size: 798 KiB

After

Width:  |  Height:  |  Size: 32 B

View file

@ -43,6 +43,7 @@ enum LoginState {
Authenticated,
}
const CLASSES_TO_ADD: &[&str] = &["flex-column", "d-flex", "h-100"];
pub enum LoginAppMsg {
Input(String),
Restart,
@ -222,7 +223,7 @@ impl LoginApp {
</p>
</div>
<div class="container">
<ul style="list-style-type: none;">
<ul class="list-unstyled">
{ for allowed.iter()
.enumerate()
.map(|(idx, allow)| self.render_auth_allowed(ctx, idx, allow)) }
@ -240,7 +241,7 @@ impl LoginApp {
</p>
</div>
<div class="container">
<form
<form class="row g-3"
onsubmit={ ctx.link().callback(|e: FocusEvent| {
console::log!("login::view_state -> Password - prevent_default()".to_string());
e.prevent_default();
@ -248,6 +249,7 @@ impl LoginApp {
} ) }
action="javascript:void(0);"
>
<div class="col-12">
<input
id="autofocus"
type="password"
@ -256,7 +258,12 @@ impl LoginApp {
oninput={ ctx.link().callback(|e: InputEvent| LoginAppMsg::Input(utils::get_value_from_input_event(e))) }
disabled={ !enable }
/>
</div>
<div class="col-12">
<center>
<button type="submit" class="btn btn-dark" disabled={ !enable }>{" Submit "}</button>
</center>
</div>
</form>
</div>
</>
@ -458,14 +465,16 @@ impl Component for LoginApp {
.cookie()
.expect_throw("failed to access page cookies");
console::log!("cookies".to_string());
console::log!(cookie.to_string());
console::log!(cookie);
let state = LoginState::Init(true);
// startConfetti();
if let Err(e) = crate::utils::body().class_list().add_1("form-signin-body") {
for x in CLASSES_TO_ADD {
if let Err(e) = crate::utils::body().class_list().add_1(x) {
console::log!(format!("class_list add error -> {:?}", e));
};
}
LoginApp {
inputvalue,
@ -767,26 +776,38 @@ impl Component for LoginApp {
// TODO: add the domain_display_name here
html! {
<main class="form-signin">
<div class="container">
<>
<main class="flex-shrink-0 form-signin">
<center>
<img src="/pkg/img/logo-square.svg" alt="Kanidm" class="kanidm_logo"/>
<h2>{ "Kanidm Alpha" } </h2>
<h3>{ "Kanidm idm.example.com" } </h3>
</center>
</div>
{ self.view_state(ctx) }
</main>
<footer class="footer mt-auto py-3 bg-light text-end">
<div class="container">
<span class="text-muted">{ "Powered by " }<a href="https://kanidm.com">{ "Kanidm" }</a></span>
</div>
</footer>
</>
}
}
fn destroy(&mut self, _ctx: &Context<Self>) {
console::log!("login::destroy".to_string());
if let Err(e) = crate::utils::body()
.class_list()
.remove_1("form-signin-body")
{
for x in CLASSES_TO_ADD {
if let Err(e) = crate::utils::body().class_list().remove_1(x) {
console::log!(format!("class_list remove error -> {:?}", e));
};
}
// if let Err(e) = crate::utils::body()
// .class_list()
// .remove_1("form-signin-body")
// {
// console::log!(format!("class_list remove error -> {:?}", e));
// }
}
fn rendered(&mut self, _ctx: &Context<Self>, _first_render: bool) {

View file

@ -19,9 +19,8 @@ body {
}
.form-signin {
width: 100%;
max-width: 330px;
padding: 15px;
/* width: 100%; */
max-width: 680px;
margin: auto;
}

View file

@ -15,9 +15,11 @@ use web_sys::{Request, RequestInit, RequestMode, Response};
mod apps;
mod components;
mod profile;
mod security;
use apps::AppsApp;
use profile::ProfileApp;
use security::SecurityApp;
#[derive(Routable, PartialEq, Clone, Debug, Serialize, Deserialize)]
@ -25,6 +27,9 @@ pub enum ViewRoute {
#[at("/ui/view/apps")]
Apps,
#[at("/ui/view/profile")]
Profile,
#[at("/ui/view/security")]
Security,
@ -73,6 +78,7 @@ fn switch(route: &ViewRoute) -> Html {
match route {
ViewRoute::Apps => html! { <AppsApp /> },
ViewRoute::Profile => html! { <ProfileApp token={ token } /> },
ViewRoute::Security => html! { <SecurityApp token={ token } /> },
ViewRoute::NotFound => html! {
<Redirect<Route> to={Route::NotFound}/>
@ -221,6 +227,13 @@ impl ViewsApp {
</Link<ViewRoute>>
</li>
<li class="nav-item">
<Link<ViewRoute> classes="nav-link" to={ViewRoute::Profile}>
<span data-feather="file"></span>
{ "Profile" }
</Link<ViewRoute>>
</li>
<li class="nav-item">
<Link<ViewRoute> classes="nav-link" to={ViewRoute::Security}>
<span data-feather="file"></span>

View file

@ -0,0 +1,125 @@
// use crate::error::*;
// use crate::models;
// use crate::utils;
use crate::views::ViewProps;
use compact_jwt::{Jws, JwsUnverified};
use gloo::console;
use kanidm_proto::v1::UserAuthToken;
use std::str::FromStr;
use wasm_bindgen::UnwrapThrowExt;
use yew::prelude::*;
// use web_sys::{Request, RequestInit, RequestMode, Response};
pub enum Msg {
// Nothing
}
// User Profile UI
pub struct ProfileApp {}
impl Component for ProfileApp {
type Message = Msg;
type Properties = ViewProps;
fn create(_ctx: &Context<Self>) -> Self {
console::log!("views::profile::create");
ProfileApp {}
}
fn changed(&mut self, _ctx: &Context<Self>) -> bool {
console::log!("views::profile::changed");
false
}
fn update(&mut self, _ctx: &Context<Self>, _msg: Self::Message) -> bool {
console::log!("views::profile::update");
/*
match msg {
ViewsMsg::Logout => {
}
}
*/
true
}
fn rendered(&mut self, _ctx: &Context<Self>, _first_render: bool) {
console::log!("views::profile::rendered");
}
/// UI view for the user profile
fn view(&self, ctx: &Context<Self>) -> Html {
console::log!("views::profile::starting view");
// Submit a req to init the session.
// The uuid we want to submit against - hint, it's us.
let token = ctx.props().token.clone();
console::log!("token: ", &token);
let jwtu = JwsUnverified::from_str(&token).expect_throw("Invalid UAT, unable to parse");
let uat: Jws<UserAuthToken> = jwtu
.unsafe_release_without_verification()
.expect_throw("Unvalid UAT, unable to release ");
let id = uat.inner.uuid.to_string();
console::log!("uuid:", id);
// let valid_token = ctx.link().send_future(async {
// match Self::fetch_token_valid(id, token).await {
// Ok(v) => v,
// Err(v) => v.into(),
// }
// });
// console::log!("valid_token: {:?}");
html! {
<>
<div class="d-flex justify-content-between flex-wrap flex-md-nowrap align-items-center pt-3 pb-2 mb-3 border-bottom">
<h2>{ "Profile" }</h2>
</div>
<div class="alert alert-warning" role="alert">
{ "🦀 Kanidm is still in early Alpha, this interface is a placeholder! " }
</div>
<form class="form-horizontal" role="form">
<div class="form-group">
<label for="legalname">{ "Legal Name" }</label>
<input type="legalname" class="form-control" disabled=true id="legalname" value={ "Cheese Bizkit" } />
</div>
<div class="form-group">
<label for="username">{ "Username" }</label>
<input type="username" class="form-control" disabled=true id="username" value={ "cbizkit" } />
</div>
<div class="form-group">
<label for="primary_email">{ "Primary Email" }</label>
<input type="primary_email" class="form-control" disabled=true id="primary_email" value={ "cheese-wizz@bizkit.example.com" } />
</div>
</form>
<strong>{ "Groups" }</strong>
<ul class="list-group">
<li class="list-group-item">
{"Crab Admins"}
// the styling for this is broken because bootstrap's doing inline styles, boo
<span class="badge bg-danger">{"HP"}</span>
</li>
<li class="list-group-item">
{"Lobster Wranglers"}
</li>
</ul>
<label for="spn">{ "SPN" }</label>
<div class="input-group mb-3">
<input type="text" id="spn" disabled=true class="form-control" value="cbizkit" aria-label="Recipient's username" aria-describedby="basic-addon2" />
<span class="input-group-text" id="basic-addon2">{"@kanidm.example.com"}</span>
</div>
</>
}
}
}
impl ProfileApp {}