From 8a572e70b15126e5aa126d92062aa5ceaace2ec2 Mon Sep 17 00:00:00 2001 From: Gregory Ballantine Date: Wed, 29 Mar 2023 18:07:46 -0400 Subject: [PATCH] Added start of Muldap web service --- cmd/root.go | 3 ++- cmd/web/init.go | 33 +++++++++++++++++++++++++ go.mod | 16 +++++++++++- go.sum | 32 ++++++++++++++++++++++++ lib/web/routes.go | 15 +++++++++++ lib/web/routes/top.go | 44 +++++++++++++++++++++++++++++++++ lib/web/routes/user.go | 48 ++++++++++++++++++++++++++++++++++++ public/css/dustdevil.css | 5 ++++ templates/index.html | 11 +++++++++ templates/layout/footer.html | 2 ++ templates/layout/header.html | 10 ++++++++ templates/user/info.html | 10 ++++++++ 12 files changed, 227 insertions(+), 2 deletions(-) create mode 100644 cmd/web/init.go create mode 100644 lib/web/routes.go create mode 100644 lib/web/routes/top.go create mode 100644 lib/web/routes/user.go create mode 100644 public/css/dustdevil.css create mode 100644 templates/index.html create mode 100644 templates/layout/footer.html create mode 100644 templates/layout/header.html create mode 100644 templates/user/info.html diff --git a/cmd/root.go b/cmd/root.go index 4b9c089..4627d9a 100644 --- a/cmd/root.go +++ b/cmd/root.go @@ -10,6 +10,7 @@ import ( "git.metaunix.net/metaunix.net/muldap/cmd/group" "git.metaunix.net/metaunix.net/muldap/cmd/ldif" "git.metaunix.net/metaunix.net/muldap/cmd/user" + "git.metaunix.net/metaunix.net/muldap/cmd/web" ) func init() { @@ -21,7 +22,7 @@ func init() { viper.BindPFlag("port", rootCmd.PersistentFlags().Lookup("port")) // register commands - rootCmd.AddCommand(group.GroupCmd, ldif.LdifCmd, user.UserCmd, searchCmd, setupCmd, versionCmd) + rootCmd.AddCommand(group.GroupCmd, ldif.LdifCmd, user.UserCmd, web.WebCmd, searchCmd, setupCmd, versionCmd) } // define root command diff --git a/cmd/web/init.go b/cmd/web/init.go new file mode 100644 index 0000000..9b759f9 --- /dev/null +++ b/cmd/web/init.go @@ -0,0 +1,33 @@ +package web + +import ( + "fmt" + + "github.com/flamego/flamego" + "github.com/flamego/template" + "github.com/spf13/cobra" + + w "git.metaunix.net/metaunix.net/muldap/lib/web" +) + +// define web command +var WebCmd = &cobra.Command{ + Use: "web", + Short: "Start the web service.", + Long: `Start the Muldap web service.`, + Run: func(cmd *cobra.Command, args []string) { + fmt.Println("Starting the Muldap web server...") + + // instantiate Flamego server instance + f := flamego.Classic() + + // enable templates + f.Use(template.Templater()) + + // register routes + w.RegisterRoutes(f) + + // start Flamego + f.Run() + }, +} diff --git a/go.mod b/go.mod index 5839425..f5183fe 100644 --- a/go.mod +++ b/go.mod @@ -11,22 +11,36 @@ require ( require ( github.com/Azure/go-ntlmssp v0.0.0-20211209120228-48547f28849e // indirect + github.com/alecthomas/participle/v2 v2.0.0 // indirect + github.com/aymanbagabas/go-osc52/v2 v2.0.1 // indirect + github.com/charmbracelet/lipgloss v0.7.1 // indirect + github.com/charmbracelet/log v0.2.1 // indirect + github.com/flamego/flamego v1.9.1 // indirect + github.com/flamego/template v1.2.1 // indirect github.com/fsnotify/fsnotify v1.5.4 // indirect github.com/go-asn1-ber/asn1-ber v1.5.4 // indirect github.com/go-ldap/ldif v0.0.0-20200320164324-fd88d9b715b3 // indirect + github.com/go-logfmt/logfmt v0.6.0 // indirect github.com/hashicorp/hcl v1.0.0 // indirect github.com/inconshreveable/mousetrap v1.0.0 // indirect + github.com/lucasb-eyer/go-colorful v1.2.0 // indirect github.com/magiconair/properties v1.8.6 // indirect + github.com/mattn/go-isatty v0.0.18 // indirect + github.com/mattn/go-runewidth v0.0.14 // indirect github.com/mitchellh/mapstructure v1.5.0 // indirect + github.com/muesli/reflow v0.3.0 // indirect + github.com/muesli/termenv v0.15.1 // indirect github.com/pelletier/go-toml v1.9.5 // indirect github.com/pelletier/go-toml/v2 v2.0.2 // indirect + github.com/pkg/errors v0.9.1 // indirect + github.com/rivo/uniseg v0.2.0 // indirect github.com/spf13/afero v1.8.2 // indirect github.com/spf13/cast v1.5.0 // indirect github.com/spf13/jwalterweatherman v1.1.0 // indirect github.com/spf13/pflag v1.0.5 // indirect github.com/subosito/gotenv v1.4.0 // indirect golang.org/x/crypto v0.0.0-20220411220226-7b82a4e95df4 // indirect - golang.org/x/sys v0.0.0-20220610221304-9f5ed59c137d // indirect + golang.org/x/sys v0.6.0 // indirect golang.org/x/text v0.3.7 // indirect gopkg.in/asn1-ber.v1 v1.0.0-20181015200546-f715ec2f112d // indirect gopkg.in/ini.v1 v1.66.6 // indirect diff --git a/go.sum b/go.sum index 069aaad..977e994 100644 --- a/go.sum +++ b/go.sum @@ -40,7 +40,15 @@ github.com/Azure/go-ntlmssp v0.0.0-20211209120228-48547f28849e h1:ZU22z/2YRFLyf/ github.com/Azure/go-ntlmssp v0.0.0-20211209120228-48547f28849e/go.mod h1:chxPXzSsl7ZWRAuOIE23GDNzjWuZquvFlgA8xmpunjU= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= +github.com/alecthomas/participle/v2 v2.0.0 h1:Fgrq+MbuSsJwIkw3fEj9h75vDP0Er5JzepJ0/HNHv0g= +github.com/alecthomas/participle/v2 v2.0.0/go.mod h1:rAKZdJldHu8084ojcWevWAL8KmEU+AT+Olodb+WoN2Y= +github.com/aymanbagabas/go-osc52/v2 v2.0.1 h1:HwpRHbFMcZLEVr42D4p7XBqjyuxQH5SMiErDT4WkJ2k= +github.com/aymanbagabas/go-osc52/v2 v2.0.1/go.mod h1:uYgXzlJ7ZpABp8OJ+exZzJJhRNQ2ASbcXHWsFqH8hp8= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/charmbracelet/lipgloss v0.7.1 h1:17WMwi7N1b1rVWOjMT+rCh7sQkvDU75B2hbZpc5Kc1E= +github.com/charmbracelet/lipgloss v0.7.1/go.mod h1:yG0k3giv8Qj8edTCbbg6AlQ5e8KNWpFujkNawKNhE2c= +github.com/charmbracelet/log v0.2.1 h1:1z7jpkk4yKyjwlmKmKMM5qnEDSpV32E7XtWhuv0mTZE= +github.com/charmbracelet/log v0.2.1/go.mod h1:GwFfjewhcVDWLrpAbY5A0Hin9YOlEn40eWT4PNaxFT4= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= @@ -58,6 +66,10 @@ github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1m github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/flamego/flamego v1.9.1 h1:JplX2eFB/CM8VHuZG6m6sHQhcBdOMhGnZFbPCxtN9ao= +github.com/flamego/flamego v1.9.1/go.mod h1:WjaZO8GM/EGvIIGXlOiwp3oPuyy1fAdjWqEgEJWovJo= +github.com/flamego/template v1.2.1 h1:bT3nSNG25GLkoYn5XcTFDf2emHFtE1B1dIBKNorusJs= +github.com/flamego/template v1.2.1/go.mod h1:p6Fj/Kq0KRXj4miVGRMyXEziU4DHudtYS54Wtp/CBlA= github.com/frankban/quicktest v1.14.3 h1:FJKSZTDHjyhriyC81FLQ0LY93eSai0ZyR/ZIkd3ZUKE= github.com/fsnotify/fsnotify v1.5.4 h1:jRbGcIw6P2Meqdwuo0H1p6JVLbL5DHKAKlYndzMwVZI= github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= @@ -73,6 +85,8 @@ github.com/go-ldap/ldap/v3 v3.4.3 h1:JCKUtJPIcyOuG7ctGabLKMgIlKnGumD/iGjuWeEruDI github.com/go-ldap/ldap/v3 v3.4.3/go.mod h1:7LdHfVt6iIOESVEe3Bs4Jp2sHEKgDeduAhgM1/f9qmo= github.com/go-ldap/ldif v0.0.0-20200320164324-fd88d9b715b3 h1:sfz1YppV05y4sYaW7kXZtrocU/+vimnIWt4cxAYh7+o= github.com/go-ldap/ldif v0.0.0-20200320164324-fd88d9b715b3/go.mod h1:ZXFhGda43Z2TVbfGZefXyMJzsDHhCh0go3bZUcwTx7o= +github.com/go-logfmt/logfmt v0.6.0 h1:wGYYu3uicYdqXVgoYbvnkrPVXkuLM1p1ifugDMEdRi4= +github.com/go-logfmt/logfmt v0.6.0/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= @@ -145,19 +159,34 @@ github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/lucasb-eyer/go-colorful v1.2.0 h1:1nnpGOrhyZZuNyfu1QjKiUICQ74+3FNCN69Aj6K7nkY= +github.com/lucasb-eyer/go-colorful v1.2.0/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0= github.com/magiconair/properties v1.8.6 h1:5ibWZ6iY0NctNGWo87LalDlEZ6R41TqbbDamhfG/Qzo= github.com/magiconair/properties v1.8.6/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= +github.com/mattn/go-isatty v0.0.18 h1:DOKFKCQ7FNG2L1rbrmstDN4QVRdS89Nkh85u68Uwp98= +github.com/mattn/go-isatty v0.0.18/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= +github.com/mattn/go-runewidth v0.0.12/go.mod h1:RAqKPSqVFrSLVXbA8x7dzmKdmGzieGRCM46jaSJTDAk= +github.com/mattn/go-runewidth v0.0.14 h1:+xnbZSEeDbOIg5/mE6JF0w6n9duR1l3/WmbinWVwUuU= +github.com/mattn/go-runewidth v0.0.14/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/muesli/reflow v0.3.0 h1:IFsN6K9NfGtjeggFP+68I4chLZV2yIKsXJFNZ+eWh6s= +github.com/muesli/reflow v0.3.0/go.mod h1:pbwTDkVPibjO2kyvBQRBxTWEEGDGq0FlB1BIKtnHY/8= +github.com/muesli/termenv v0.15.1 h1:UzuTb/+hhlBugQz28rpzey4ZuKcZ03MeKsoG7IJZIxs= +github.com/muesli/termenv v0.15.1/go.mod h1:HeAQPTzpfs016yGtA4g00CsdYnVLJvxsS4ANqrZs2sQ= github.com/pelletier/go-toml v1.9.5 h1:4yBQzkHv+7BHq2PQUZF3Mx0IYxG7LsP222s7Agd3ve8= github.com/pelletier/go-toml v1.9.5/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= github.com/pelletier/go-toml/v2 v2.0.2 h1:+jQXlF3scKIcSEKkdHzXhCTDLPFi5r1wnK6yPS+49Gw= github.com/pelletier/go-toml/v2 v2.0.2/go.mod h1:MovirKjgVRESsAvNZlAjtFwV867yGuwRkXbG66OzopI= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/sftp v1.13.1/go.mod h1:3HaPG6Dq1ILlpPZRO0HVMrsydcdLt6HRDccSgb87qRg= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/rivo/uniseg v0.1.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= +github.com/rivo/uniseg v0.2.0 h1:S1pD9weZBuJdFmowNwbpi7BJ8TNftyUImj/0WQi72jY= +github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.6.1 h1:/FiVV8dS/e+YqF2JvO3yXRFbBLTIuSDkuC7aBOAvL+k= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= @@ -180,6 +209,7 @@ github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5 github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.2 h1:4jaiDzPyXQvSd7D0EjG45355tLlV3VOECpq10pLC+8s= github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals= +github.com/stretchr/testify v1.8.2 h1:+h33VjcLVPDHtOdpUCuF+7gSuG3yGIftsP1YvFihtJ8= github.com/subosito/gotenv v1.4.0 h1:yAzM1+SmVcz5R4tXGsNMu1jUl2aOJXoiWUCEwwnGrvs= github.com/subosito/gotenv v1.4.0/go.mod h1:mZd6rFysKEcUhUHXJk0C/08wAgyDBFuwEYL7vWWGaGo= github.com/vetinari/ldif v0.0.0-20180518094131-2a83f6d39543 h1:gDWZFQtWWFQ1S82ySjPttDjeEwNqAaJM1usTujI4/7Q= @@ -326,6 +356,8 @@ golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220610221304-9f5ed59c137d h1:Zu/JngovGLVi6t2J3nmAf3AoTDwuzw85YZ3b9o4yU7s= golang.org/x/sys v0.0.0-20220610221304-9f5ed59c137d/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.6.0 h1:MVltZSvRTcU2ljQOhs94SXPftV6DCNnZViHeQps87pQ= +golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= diff --git a/lib/web/routes.go b/lib/web/routes.go new file mode 100644 index 0000000..de02f58 --- /dev/null +++ b/lib/web/routes.go @@ -0,0 +1,15 @@ +package web + +import ( + "github.com/flamego/flamego" + + "git.metaunix.net/metaunix.net/muldap/lib/web/routes" +) + +func RegisterRoutes(f *flamego.Flame) { + // top-level routes + f.Get("/", routes.GetTopIndex) + + // user routes + f.Get("/user/{uid}", routes.GetUserInfo) +} diff --git a/lib/web/routes/top.go b/lib/web/routes/top.go new file mode 100644 index 0000000..36a5a1e --- /dev/null +++ b/lib/web/routes/top.go @@ -0,0 +1,44 @@ +package routes + +import ( + "fmt" + "log" + "net/http" + + "github.com/flamego/template" + "github.com/spf13/viper" + "gopkg.in/ldap.v2" +) + +func GetTopIndex(t template.Template, data template.Data) { + // create new LDAP connection + l, err := ldap.Dial("tcp", fmt.Sprintf("%s:%d", viper.GetString("host"), viper.GetInt("port"))) + if err != nil { + log.Fatal(err) + } + defer l.Close() + + // bind as the admin user + err = l.Bind(viper.GetString("bind_dn"), viper.GetString("bind_pw")) + if err != nil { + log.Fatal(err) + } + + searchRequest := ldap.NewSearchRequest( + viper.GetString("user.base_ou"), // The base dn to search + ldap.ScopeWholeSubtree, ldap.NeverDerefAliases, 0, 0, false, + "(&(objectClass=inetOrgPerson))", // The filter to apply + []string{"dn", "uid", "displayName"}, // A list attributes to retrieve + nil, + ) + + sr, err := l.Search(searchRequest) + if err != nil { + log.Fatal(err) + } + + data["results"] = sr + + data["title"] = "Dashboard" + t.HTML(http.StatusOK, "index") +} diff --git a/lib/web/routes/user.go b/lib/web/routes/user.go new file mode 100644 index 0000000..ba8c1ca --- /dev/null +++ b/lib/web/routes/user.go @@ -0,0 +1,48 @@ +package routes + +import ( + "fmt" + "log" + "net/http" + + "github.com/flamego/flamego" + "github.com/flamego/template" + "github.com/spf13/viper" + "gopkg.in/ldap.v2" +) + +func GetUserInfo(c flamego.Context, t template.Template, data template.Data) { + // create new LDAP connection + l, err := ldap.Dial("tcp", fmt.Sprintf("%s:%d", viper.GetString("host"), viper.GetInt("port"))) + if err != nil { + log.Fatal(err) + } + defer l.Close() + + // bind as the admin user + err = l.Bind(viper.GetString("bind_dn"), viper.GetString("bind_pw")) + if err != nil { + log.Fatal(err) + } + + // set up user DN + userDn := fmt.Sprintf("%s=%s,%s", viper.GetString("user.uid_attr"), c.Param("uid"), viper.GetString("user.base_ou")) + + searchRequest := ldap.NewSearchRequest( + userDn, // The base dn to search + ldap.ScopeWholeSubtree, ldap.NeverDerefAliases, 0, 0, false, + "(&(objectClass=inetOrgPerson))", // The filter to apply + nil, // A list attributes to retrieve + nil, + ) + + sr, err := l.Search(searchRequest) + if err != nil { + log.Fatal(err) + } + + data["user"] = sr.Entries[0] + + data["title"] = "User Info" + t.HTML(http.StatusOK, "user/info") +} diff --git a/public/css/dustdevil.css b/public/css/dustdevil.css new file mode 100644 index 0000000..e695368 --- /dev/null +++ b/public/css/dustdevil.css @@ -0,0 +1,5 @@ +body{ + background: #eee; + font-family: Arial, sans-serif; + font-size: 18px; +} diff --git a/templates/index.html b/templates/index.html new file mode 100644 index 0000000..b812ccb --- /dev/null +++ b/templates/index.html @@ -0,0 +1,11 @@ +{{ template "layout/header" . }} + +

This is a test.

+ + + +{{ template "layout/footer" . }} diff --git a/templates/layout/footer.html b/templates/layout/footer.html new file mode 100644 index 0000000..308b1d0 --- /dev/null +++ b/templates/layout/footer.html @@ -0,0 +1,2 @@ + + diff --git a/templates/layout/header.html b/templates/layout/header.html new file mode 100644 index 0000000..1f09d97 --- /dev/null +++ b/templates/layout/header.html @@ -0,0 +1,10 @@ + + + + + + + {{ .title }} | Muldap Web + + + diff --git a/templates/user/info.html b/templates/user/info.html new file mode 100644 index 0000000..4cae3c6 --- /dev/null +++ b/templates/user/info.html @@ -0,0 +1,10 @@ +{{ template "layout/header" . }} + +

{{ .user.GetAttributeValue "displayName" }}

+ +

First name: {{ .user.GetAttributeValue "givenName" }}

+

Last name: {{ .user.GetAttributeValue "sn" }}

+

User ID: {{ .user.GetAttributeValue "uid" }}

+

Email address: {{ .user.GetAttributeValue "mail" }}

+ +{{ template "layout/footer" . }}