diff --git a/go.mod b/go.mod
index 0a8bea8..947a3af 100644
--- a/go.mod
+++ b/go.mod
@@ -5,6 +5,7 @@ go 1.12
require (
forge.cadoles.com/wpetit/goweb v0.0.0-20190513070928-35c763a6c65f
github.com/go-chi/chi v4.0.2+incompatible
+ github.com/gorilla/csrf v1.5.1
github.com/gorilla/sessions v1.1.3
github.com/oxtoacart/bpool v0.0.0-20190227141107-8c4636f812cc // indirect
github.com/pkg/errors v0.8.1
diff --git a/go.sum b/go.sum
index 047f849..a443486 100644
--- a/go.sum
+++ b/go.sum
@@ -6,6 +6,8 @@ github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGa
github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
github.com/gorilla/context v1.1.1 h1:AWwleXJkX/nhcU9bZSnZoi3h/qGYqQAGhq6zZe/aQW8=
github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg=
+github.com/gorilla/csrf v1.5.1 h1:UASc2+EB0T51tvl6/2ls2ciA8/qC7KdTO7DsOEKbttQ=
+github.com/gorilla/csrf v1.5.1/go.mod h1:HTDW7xFOO1aHddQUmghe9/2zTvg7AYCnRCs7MxTGu/0=
github.com/gorilla/securecookie v1.1.1 h1:miw7JPhV+b/lAHSXz4qd/nN9jRiAFV5FwjeKyCS8BvQ=
github.com/gorilla/securecookie v1.1.1/go.mod h1:ra0sb63/xPlUeL+yeDciTfxMRAA+MP+HVt/4epWDjd4=
github.com/gorilla/sessions v1.1.3 h1:uXoZdcdA5XdXF3QzuSlheVRUvjl+1rKY7zBXL68L9RU=
@@ -14,6 +16,7 @@ github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7
github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=
github.com/oxtoacart/bpool v0.0.0-20190227141107-8c4636f812cc h1:uhnyuvDwdKbjemAXHKsiEZOPagHim2nRjMcazH1g26A=
github.com/oxtoacart/bpool v0.0.0-20190227141107-8c4636f812cc/go.mod h1:L3UMQOThbttwfYRNFOWLLVXMhk5Lkio4GGOtw5UrxS0=
+github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I=
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM=
diff --git a/ldap/service.go b/ldap/service.go
index 2338369..5f8ab85 100644
--- a/ldap/service.go
+++ b/ldap/service.go
@@ -68,6 +68,23 @@ func (s *Service) Connect() (*ldap.Conn, error) {
return conn, err
}
+func (s *Service) ModifyPassword(identity, oldPassword, newPassword string) error {
+ conn, err := s.Connect()
+ if err != nil {
+ return errors.Wrap(err, "error while connecting to ldap server")
+ }
+ defer conn.Close()
+ return s.ModifyPasswordConn(conn, identity, oldPassword, newPassword)
+}
+
+func (s *Service) ModifyPasswordConn(conn *ldap.Conn, identity, oldPassword, newPassword string) error {
+ req := ldap.NewPasswordModifyRequest("", oldPassword, newPassword)
+ if _, err := conn.PasswordModify(req); err != nil {
+ return errors.Wrap(err, "error while modifying password")
+ }
+ return nil
+}
+
// From retrieves the ldap service in the given container
func From(container *service.Container) (*Service, error) {
service, err := container.Service(ServiceName)
diff --git a/misc/ldap/jdoe.json b/misc/ldap/jdoe.json
new file mode 100644
index 0000000..2ae4033
--- /dev/null
+++ b/misc/ldap/jdoe.json
@@ -0,0 +1,20 @@
+{
+ "dn": "uid=jdoe,o=test",
+ "attributes": {
+ "cn": [
+ "John Doe"
+ ],
+ "mail": [
+ "john.doe@example.com"
+ ],
+ "objectclass": [
+ "person"
+ ],
+ "uid": [
+ "jdoe"
+ ],
+ "userpassword": [
+ "jdoe"
+ ]
+ }
+}
\ No newline at end of file
diff --git a/modd.conf b/modd.conf
index ba23ea7..d5ea49c 100644
--- a/modd.conf
+++ b/modd.conf
@@ -6,4 +6,4 @@ Makefile {
prep: make bin/server
prep: [ -e data/server.conf ] || ( mkdir -p data && bin/server -dump-config > data/server.conf )
daemon: bin/server -workdir "./cmd/server" -config ../../data/server.conf
-}
+}
\ No newline at end of file
diff --git a/script/release b/script/release
new file mode 100755
index 0000000..732c16a
--- /dev/null
+++ b/script/release
@@ -0,0 +1,109 @@
+#!/bin/bash
+
+set -eo pipefail
+
+OS_TARGETS=(linux)
+ARCH_TARGETS=${ARCH_TARGETS:-amd64 arm 386}
+
+DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null && pwd )"
+
+function build {
+
+ local name=$1
+ local srcdir=$2
+ local os=$3
+ local arch=$4
+
+ local dirname="$name-$os-$arch"
+ local destdir="$DIR/../release/$dirname"
+
+ rm -rf "$destdir"
+ mkdir -p "$destdir"
+
+ echo "building $dirname..."
+
+ CGO_ENABLED=0 GOOS="$os" GOARCH="$arch" go build \
+ -mod=vendor \
+ -ldflags="-s -w" \
+ -gcflags=-trimpath="${PWD}" \
+ -asmflags=-trimpath="${PWD}" \
+ -o "$destdir/$name" \
+ "$srcdir"
+
+ if [ ! -z "$(which upx)" ]; then
+ upx --best "$destdir/$name"
+ fi
+
+}
+
+function copy {
+
+ local name=$1
+ local os=$2
+ local arch=$3
+ local src=$4
+ local dest=$5
+
+ local dirname="$name-$os-$arch"
+ local destdir="$DIR/../release/$dirname"
+
+ echo "copying '$src' to '$destdir/$dest'..."
+
+ mkdir -p "$(dirname $destdir/$dest)"
+
+ cp -rfL $src "$destdir/$dest"
+
+}
+
+function dump_default_conf {
+ # Generate and copy configuration file
+ local command=$1
+ local os=$2
+ local arch=$3
+ local tmp_conf=$(mktemp)
+
+ go run "$DIR/../cmd/$command" -dump-config > "$tmp_conf"
+ copy "$command" $os $arch "$tmp_conf" "$command.conf"
+ rm -f "$tmp_conf"
+}
+
+function compress {
+
+ local name=$1
+ local os=$2
+ local arch=$3
+
+ local dirname="$name-$os-$arch"
+ local destdir="$DIR/../release/$dirname"
+
+ echo "compressing $dirname..."
+ tar -czf "$destdir.tar.gz" -C "$destdir/../" "$dirname"
+}
+
+function release_server {
+
+ local os=$1
+ local arch=$2
+
+ build 'server' "$DIR/../cmd/server" $os $arch
+
+ dump_default_conf 'server' $os $arch
+
+ copy 'server' $os $arch "$DIR/../README.md" "README.md"
+ copy 'server' $os $arch "$DIR/../LICENSE" "LICENSE"
+ copy 'server' $os $arch "$DIR/../cmd/server/templates" "templates"
+ copy 'server' $os $arch "$DIR/../cmd/server/public" "public"
+
+ compress 'server' $os $arch
+
+}
+
+function main {
+ for os in ${OS_TARGETS[@]}; do
+ for arch in ${ARCH_TARGETS[@]}; do
+ release_server $os $arch
+ done
+ done
+}
+
+main
\ No newline at end of file