From b99a321dedb4b25c320e362964841f1dbc980667 Mon Sep 17 00:00:00 2001 From: nemunaire Date: Mon, 12 Nov 2018 23:31:10 +0100 Subject: [PATCH] Initial commit --- .gitignore | 2 + change.go | 51 + ldap.go | 130 + login.go | 44 + lost.go | 155 + main.go | 126 + reset.go | 70 + static/change.html | 40 + static/css/error.css | 48 + static/css/fonts/code_light.css | 12 + .../fonts/code_light/code_light-webfont.eot | Bin 0 -> 12605 bytes .../fonts/code_light/code_light-webfont.svg | 1743 ++++++ .../fonts/code_light/code_light-webfont.ttf | Bin 0 -> 33536 bytes .../fonts/code_light/code_light-webfont.woff | Bin 0 -> 14696 bytes .../fonts/code_light/code_light-webfont.woff2 | Bin 0 -> 11304 bytes static/css/fonts/qarnot.css | 48 + static/css/fonts/qarnot/qarnot.eot | Bin 0 -> 5096 bytes static/css/fonts/qarnot/qarnot.svg | 17 + static/css/fonts/qarnot/qarnot.ttf | Bin 0 -> 4936 bytes static/css/fonts/qarnot/qarnot.woff | Bin 0 -> 5012 bytes static/css/qarnot-mdl-dark.css | 4268 +++++++++++++++ static/css/qarnot-mdl-dark.min.css | 1 + static/css/qarnot-mdl.css | 4684 +++++++++++++++++ static/css/qarnot-mdl.min.css | 1 + static/css/qarnot.css | 212 + static/css/qarnot.min.css | 1 + static/css/sso.css | 163 + static/css/sso.min.css | 6 + static/footer.html | 17 + static/header.html | 31 + static/login.html | 30 + static/lost.html | 25 + static/message.html | 7 + static/reset.html | 34 + tmpl.go | 31 + 35 files changed, 11997 insertions(+) create mode 100644 .gitignore create mode 100644 change.go create mode 100644 ldap.go create mode 100644 login.go create mode 100644 lost.go create mode 100644 main.go create mode 100644 reset.go create mode 100644 static/change.html create mode 100644 static/css/error.css create mode 100755 static/css/fonts/code_light.css create mode 100755 static/css/fonts/code_light/code_light-webfont.eot create mode 100755 static/css/fonts/code_light/code_light-webfont.svg create mode 100755 static/css/fonts/code_light/code_light-webfont.ttf create mode 100755 static/css/fonts/code_light/code_light-webfont.woff create mode 100755 static/css/fonts/code_light/code_light-webfont.woff2 create mode 100755 static/css/fonts/qarnot.css create mode 100755 static/css/fonts/qarnot/qarnot.eot create mode 100755 static/css/fonts/qarnot/qarnot.svg create mode 100755 static/css/fonts/qarnot/qarnot.ttf create mode 100755 static/css/fonts/qarnot/qarnot.woff create mode 100644 static/css/qarnot-mdl-dark.css create mode 100644 static/css/qarnot-mdl-dark.min.css create mode 100644 static/css/qarnot-mdl.css create mode 100644 static/css/qarnot-mdl.min.css create mode 100644 static/css/qarnot.css create mode 100644 static/css/qarnot.min.css create mode 100644 static/css/sso.css create mode 100755 static/css/sso.min.css create mode 100644 static/footer.html create mode 100644 static/header.html create mode 100644 static/login.html create mode 100644 static/lost.html create mode 100644 static/message.html create mode 100644 static/reset.html create mode 100644 tmpl.go diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..8d2b8b5 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +chldapasswd +config.json \ No newline at end of file diff --git a/change.go b/change.go new file mode 100644 index 0000000..f0600d7 --- /dev/null +++ b/change.go @@ -0,0 +1,51 @@ +package main + +import ( + "errors" + "log" + "net/http" +) + +func checkPasswdConstraint(password string) error { + if len(password) < 8 { + return errors.New("too short, please choose a password at least 8 characters long.") + } + + return nil +} + +func changePassword(w http.ResponseWriter, r *http.Request) { + if r.Method != "POST" { + displayTmpl(w, "change.html", map[string]interface{}{}) + return + } + + // Check the two new passwords are identical + if r.PostFormValue("newpassword") != r.PostFormValue("new2password") { + displayTmplError(w, http.StatusNotAcceptable, "change.html", map[string]interface{}{"error": "New passwords are not identical. Please retry."}) + } else if len(r.PostFormValue("login")) == 0 { + displayTmplError(w, http.StatusNotAcceptable, "change.html", map[string]interface{}{"error": "Please provide a valid login"}) + } else if err := checkPasswdConstraint(r.PostFormValue("newpassword")); err != nil { + displayTmplError(w, http.StatusNotAcceptable, "change.html", map[string]interface{}{"error": "The password you chose doesn't respect all constraints: " + err.Error()}) + } else { + conn, err := myLDAP.Connect() + if err != nil || conn == nil { + log.Println(err) + displayTmplError(w, http.StatusInternalServerError, "change.html", map[string]interface{}{"error": err.Error()}) + } else if err := conn.ServiceBind(); err != nil { + log.Println(err) + displayTmplError(w, http.StatusInternalServerError, "change.html", map[string]interface{}{"error": err.Error()}) + } else if dn, err := conn.SearchDN(r.PostFormValue("login")); err != nil { + log.Println(err) + displayTmplError(w, http.StatusInternalServerError, "change.html", map[string]interface{}{"error": err.Error()}) + } else if err := conn.Bind(dn, r.PostFormValue("password")); err != nil { + log.Println(err) + displayTmplError(w, http.StatusUnauthorized, "change.html", map[string]interface{}{"error": err.Error()}) + } else if err := conn.ChangePassword(dn, r.PostFormValue("newpassword")); err != nil { + log.Println(err) + displayTmplError(w, http.StatusInternalServerError, "change.html", map[string]interface{}{"error": err.Error()}) + } else { + displayMsg(w, "Password successfully changed!", http.StatusOK) + } + } +} diff --git a/ldap.go b/ldap.go new file mode 100644 index 0000000..595e294 --- /dev/null +++ b/ldap.go @@ -0,0 +1,130 @@ +package main + +import ( + "crypto/rand" + "crypto/tls" + "encoding/base64" + "errors" + "fmt" + + "github.com/amoghe/go-crypt" + "gopkg.in/ldap.v2" +) + +type LDAP struct { + Host string + Port int + Starttls bool + Ssl bool + BaseDN string + ServiceDN string + ServicePassword string +} + +func (l LDAP) Connect() (*LDAPConn, error) { + if l.Ssl { + if c, err := ldap.DialTLS("tcp", fmt.Sprintf("%s:%d", l.Host, l.Port), &tls.Config{ServerName: l.Host}); err != nil { + return nil, errors.New("unable to establish LDAPS connection to " + fmt.Sprintf("%s:%d", l.Host, l.Port) + ": " + err.Error()) + } else { + return &LDAPConn{ + LDAP: l, + connection: c, + }, nil + } + } else if c, err := ldap.Dial("tcp", fmt.Sprintf("%s:%d", l.Host, l.Port)); err != nil { + return nil, errors.New("unable to establish LDAP connection to " + fmt.Sprintf("%s:%d", l.Host, l.Port) + ": " + err.Error()) + } else { + if l.Starttls { + if err = c.StartTLS(&tls.Config{ServerName: l.Host}); err != nil { + c.Close() + return nil, errors.New("unable to StartTLS: " + err.Error()) + } + } + + return &LDAPConn{ + LDAP: l, + connection: c, + }, nil + } +} + + +type LDAPConn struct { + LDAP + connection *ldap.Conn +} + +func (l LDAPConn) ServiceBind() error { + return l.connection.Bind(l.ServiceDN, l.ServicePassword) +} + +func (l LDAPConn) Bind(username string, password string) error { + return l.connection.Bind(username, password) +} + +func (l LDAPConn) SearchDN(username string) (string, error) { + searchRequest := ldap.NewSearchRequest( + l.BaseDN, + ldap.ScopeWholeSubtree, ldap.NeverDerefAliases, 0, 0, false, + fmt.Sprintf("(&(objectClass=organizationalPerson)(uid=%s))", username), + []string{"dn"}, + nil, + ) + + sr, err := l.connection.Search(searchRequest) + if err != nil { + return "", err + } + + if len(sr.Entries) != 1 { + return "", errors.New("User does not exist or too many entries returned") + } + + return sr.Entries[0].DN, nil +} + +func (l LDAPConn) GetEntry(dn string) ([]*ldap.EntryAttribute, error) { + searchRequest := ldap.NewSearchRequest( + dn, + ldap.ScopeBaseObject, ldap.NeverDerefAliases, 0, 0, false, + "(objectClass=*)", []string{}, nil, + ) + + sr, err := l.connection.Search(searchRequest) + if err != nil { + return nil, err + } + + if len(sr.Entries) != 1 { + return nil, errors.New("User does not exist or too many entries returned") + } + + return sr.Entries[0].Attributes, nil +} + +func genSalt() (string, error) { + b := make([]byte, 16) + if _, err := rand.Read(b); err != nil { + return "", err + } + + return base64.StdEncoding.EncodeToString(b), nil +} + +func (l LDAPConn) ChangePassword(dn string, rawpassword string) error { + salt, err := genSalt() + if err != nil { + return err + } + + hashedpasswd, err := crypt.Crypt(rawpassword, "$6$" + salt + "$") + if err != nil { + return err + } + + modify := ldap.NewModifyRequest(dn) + modify.Replace("userPassword", []string{"{CRYPT}" + hashedpasswd}) + + + return l.connection.Modify(modify) +} diff --git a/login.go b/login.go new file mode 100644 index 0000000..4ddc935 --- /dev/null +++ b/login.go @@ -0,0 +1,44 @@ +package main + +import ( + "html/template" + "log" + "net/http" +) + +func tryLogin(w http.ResponseWriter, r *http.Request) { + if r.Method != "POST" { + displayTmpl(w, "login.html", map[string]interface{}{}) + return + } + + conn, err := myLDAP.Connect() + if err != nil || conn == nil { + log.Println(err) + displayTmplError(w, http.StatusInternalServerError, "login.html", map[string]interface{}{"error": err.Error()}) + } else if err := conn.ServiceBind(); err != nil { + log.Println(err) + displayTmplError(w, http.StatusInternalServerError, "login.html", map[string]interface{}{"error": err.Error()}) + } else if dn, err := conn.SearchDN(r.PostFormValue("login")); err != nil { + log.Println(err) + displayTmplError(w, http.StatusInternalServerError, "login.html", map[string]interface{}{"error": err.Error()}) + } else if err := conn.Bind(dn, r.PostFormValue("password")); err != nil { + log.Println(err) + displayTmplError(w, http.StatusUnauthorized, "login.html", map[string]interface{}{"error": err.Error()}) + } else if entries, err := conn.GetEntry(dn); err != nil { + log.Println(err) + displayTmplError(w, http.StatusInternalServerError, "login.html", map[string]interface{}{"error": err.Error()}) + } else { + cnt := "")}) + } +} diff --git a/lost.go b/lost.go new file mode 100644 index 0000000..795b341 --- /dev/null +++ b/lost.go @@ -0,0 +1,155 @@ +package main + +import ( + "crypto/sha512" + "encoding/base64" + "encoding/binary" + "io" + "net/http" + "log" + "os" + "os/exec" + "time" + + "gopkg.in/gomail.v2" +) + +func (l LDAPConn) genToken(dn string, previous bool) string { + hour := time.Now() + // Generate the previous token? + if previous { + hour.Add(time.Hour * -1) + } + + b := make([]byte, binary.MaxVarintLen64) + binary.PutVarint(b, hour.Round(time.Hour).Unix()) + + // Search the email address and current password + entries, err := l.GetEntry(dn) + if err != nil { + log.Println("Unable to generate token:", err) + return "#err" + } + + email := "" + curpasswd := "" + for _, e := range entries { + if e.Name == "mail" { + email += e.Values[0] + } else if e.Name == "userPassword" { + curpasswd += e.Values[0] + } + } + + // Hash that + hash := sha512.New() + hash.Write(b) + hash.Write([]byte(dn)) + hash.Write([]byte(email)) + hash.Write([]byte(curpasswd)) + + return base64.StdEncoding.EncodeToString(hash.Sum(nil)[:]) +} + + +func lostPassword(w http.ResponseWriter, r *http.Request) { + if r.Method != "POST" { + displayTmpl(w, "lost.html", map[string]interface{}{}) + return + } + + // Connect to the LDAP server + conn, err := myLDAP.Connect() + if err != nil || conn == nil { + log.Println(err) + displayTmplError(w, http.StatusInternalServerError, "lost.html", map[string]interface{}{"error": err.Error()}) + return + } + + // Bind as service to perform the search + err = conn.ServiceBind() + if err != nil { + log.Println(err) + displayTmplError(w, http.StatusInternalServerError, "lost.html", map[string]interface{}{"error": err.Error()}) + return + } + + // Search the dn of the given user + dn, err := conn.SearchDN(r.PostFormValue("login")) + if err != nil { + log.Println(err) + displayTmplError(w, http.StatusInternalServerError, "lost.html", map[string]interface{}{"error": err.Error()}) + return + } + + // Generate the token + token := conn.genToken(dn, false) + + // Search the email address + entries, err := conn.GetEntry(dn) + if err != nil { + log.Println(err) + displayTmplError(w, http.StatusInternalServerError, "lost.html", map[string]interface{}{"error": err.Error()}) + return + } + + email := "" + cn := "" + for _, e := range entries { + if e.Name == "mail" { + email = e.Values[0] + } + if e.Name == "cn" { + cn = e.Values[0] + } + } + + if email == "" { + log.Println("Unable to find a valid adress for user " + dn) + displayTmplError(w, http.StatusBadRequest, "lost.html", map[string]interface{}{"error": "We were unable to find a valid email address associated with your account. Please contact an administrator."}) + return + } + + // Send the email + m := gomail.NewMessage() + m.SetHeader("From", "noreply@qarnot-computing.net") + m.SetHeader("To", email) + m.SetHeader("Subject", "SSO qarnot.net: password recovery") + m.SetBody("text/plain", "Hello " + cn + "!\n\nSomeone, and we hope it's you, has requested to reset your account password.\nIn order to continue, go to: https://login.qarnot.net/reset?l=" + r.PostFormValue("login") + "&t=" + token + "\n\nBest regards,\n-- \nQarnot SSO") + + // Using local sendmail: delegate to the local admin sys the responsability to transport the mail + s := gomail.SendFunc(func(from string, to []string, msg io.WriterTo) error { + cmd := exec.Command("sendmail", "-t") + cmd.Stdout = os.Stdout + cmd.Stderr = os.Stderr + + pw, err := cmd.StdinPipe() + if err != nil { + return err + } + + err = cmd.Start() + if err != nil { + return err + } + + var errs [3]error + _, errs[0] = m.WriteTo(pw) + errs[1] = pw.Close() + errs[2] = cmd.Wait() + for _, err = range errs { + if err != nil { + return err + } + } + return nil + }) + + if err := gomail.Send(s, m); err != nil { + log.Println("Unable to send email: " + err.Error()) + displayTmplError(w, http.StatusInternalServerError, "lost.html", map[string]interface{}{"error": "Unable to send email: " + err.Error()}) + return + } + + displayMsg(w, "Password recovery email sent, check your inbox.", http.StatusOK) +} diff --git a/main.go b/main.go new file mode 100644 index 0000000..2ce0b7b --- /dev/null +++ b/main.go @@ -0,0 +1,126 @@ +package main + +import ( + "context" + "encoding/json" + "flag" + "fmt" + "io/ioutil" + "log" + "net/http" + "net/url" + "os" + "os/signal" + "path" + "path/filepath" + "strings" + "syscall" +) + +var StaticDir string = "./static/" + +var myLDAP = LDAP{ + Host: "localhost", + Port: 389, + BaseDN: "dc=example,dc=com", +} + + +type ResponseWriterPrefix struct { + real http.ResponseWriter + prefix string +} + +func (r ResponseWriterPrefix) Header() http.Header { + return r.real.Header() +} + +func (r ResponseWriterPrefix) WriteHeader(s int) { + if v, exists := r.real.Header()["Location"]; exists { + r.real.Header().Set("Location", r.prefix + v[0]) + } + r.real.WriteHeader(s) +} + +func (r ResponseWriterPrefix) Write(z []byte) (int, error) { + return r.real.Write(z) +} + +func StripPrefix(prefix string, h http.Handler) http.Handler { + if prefix == "" { + return h + } + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + if prefix != "/" && r.URL.Path == "/" { + http.Redirect(w, r, prefix + "/", http.StatusFound) + } else if p := strings.TrimPrefix(r.URL.Path, prefix); len(p) < len(r.URL.Path) { + r2 := new(http.Request) + *r2 = *r + r2.URL = new(url.URL) + *r2.URL = *r.URL + r2.URL.Path = p + h.ServeHTTP(ResponseWriterPrefix{w, prefix}, r2) + } else { + h.ServeHTTP(w, r) + } + }) +} + +func main() { + var bind = flag.String("bind", "127.0.0.1:8080", "Bind port/socket") + var baseURL = flag.String("baseurl", "/", "URL prepended to each URL") + flag.StringVar(&StaticDir, "static", StaticDir, "Directory containing static files") + flag.Parse() + + // Sanitize options + var err error + log.Println("Checking paths...") + if StaticDir, err = filepath.Abs(StaticDir); err != nil { + log.Fatal(err) + } + if *baseURL != "/" { + tmp := path.Clean(*baseURL) + baseURL = &tmp + } else { + tmp := "" + baseURL = &tmp + } + + // Load config file + if fd, err := os.Open("config.json"); err != nil { + log.Fatal(err) + } else if cnt, err := ioutil.ReadAll(fd); err != nil { + log.Fatal(err) + } else if err := json.Unmarshal(cnt, &myLDAP); err != nil { + log.Fatal(err) + } + + // Prepare graceful shutdown + interrupt := make(chan os.Signal, 1) + signal.Notify(interrupt, os.Interrupt, syscall.SIGTERM) + + // Register handlers + http.HandleFunc(fmt.Sprintf("%s/", *baseURL), changePassword) + http.Handle(fmt.Sprintf("%s/css/", *baseURL), http.StripPrefix(*baseURL, http.FileServer(http.Dir(StaticDir)))) + http.HandleFunc(fmt.Sprintf("%s/login", *baseURL), tryLogin) + http.HandleFunc(fmt.Sprintf("%s/change", *baseURL), changePassword) + http.HandleFunc(fmt.Sprintf("%s/reset", *baseURL), resetPassword) + http.HandleFunc(fmt.Sprintf("%s/lost", *baseURL), lostPassword) + + srv := &http.Server{ + Addr: *bind, + } + + // Serve content + go func() { + log.Fatal(srv.ListenAndServe()) + }() + log.Println(fmt.Sprintf("Ready, listening on %s", *bind)) + + // Wait shutdown signal + <-interrupt + + log.Print("The service is shutting down...") + srv.Shutdown(context.Background()) + log.Println("done") +} diff --git a/reset.go b/reset.go new file mode 100644 index 0000000..567ad56 --- /dev/null +++ b/reset.go @@ -0,0 +1,70 @@ +package main + +import ( + "log" + "net/http" + "strings" +) + + +func resetPassword(w http.ResponseWriter, r *http.Request) { + if len(r.URL.Query().Get("l")) == 0 || len(r.URL.Query().Get("t")) == 0 { + http.Redirect(w, r, "lost", http.StatusFound) + } + + if r.Method != "POST" { + displayTmpl(w, "reset.html", map[string]interface{}{ + "login": r.URL.Query().Get("l"), + "token": strings.Replace(r.URL.Query().Get("t"), " ", "+", -1), + }) + return + } + + // Check the two new passwords are identical + if r.PostFormValue("newpassword") != r.PostFormValue("new2password") { + displayTmplError(w, http.StatusNotAcceptable, "reset.html", map[string]interface{}{"error": "New passwords are not identical. Please retry."}) + return + } else if err := checkPasswdConstraint(r.PostFormValue("newpassword")); err != nil { + displayTmplError(w, http.StatusNotAcceptable, "reset.html", map[string]interface{}{"error": "The password you chose doesn't respect all constraints: " + err.Error()}) + return + } + + // Connect to the LDAP server + conn, err := myLDAP.Connect() + if err != nil || conn == nil { + log.Println(err) + displayTmplError(w, http.StatusInternalServerError, "reset.html", map[string]interface{}{"error": err.Error()}) + return + } + + // Bind as service to perform the search + err = conn.ServiceBind() + if err != nil { + log.Println(err) + displayTmplError(w, http.StatusInternalServerError, "reset.html", map[string]interface{}{"error": err.Error()}) + return + } + + // Search the dn of the given user + dn, err := conn.SearchDN(r.PostFormValue("login")) + if err != nil { + log.Println(err) + displayTmplError(w, http.StatusInternalServerError, "reset.html", map[string]interface{}{"error": err.Error()}) + return + } + + // Check token validity (allow current token + last one) + if conn.genToken(dn, false) != r.PostFormValue("token") && conn.genToken(dn, true) != r.PostFormValue("token") { + displayTmplError(w, http.StatusNotAcceptable, "reset.html", map[string]interface{}{"error": "Token invalid, please retry the lost password procedure. Please note that our token expires after 1 hour."}) + return + } + + // Replace the password by the new given + if err := conn.ChangePassword(dn, r.PostFormValue("newpassword")); err != nil { + log.Println(err) + displayTmplError(w, http.StatusInternalServerError, "reset.html", map[string]interface{}{"error": err.Error()}) + return + } + + displayMsg(w, "Password successfully changed!", http.StatusOK) +} diff --git a/static/change.html b/static/change.html new file mode 100644 index 0000000..4866dcf --- /dev/null +++ b/static/change.html @@ -0,0 +1,40 @@ +{{template "header"}} +
+ + + Change your password + Fill the following fields! + + + + + {{if .error}}{{end}} +
+ + + +
+
+ + + +
+
+ + + +
+
+ + + +
+
+ + + + +
+{{template "footer"}} diff --git a/static/css/error.css b/static/css/error.css new file mode 100644 index 0000000..46a9770 --- /dev/null +++ b/static/css/error.css @@ -0,0 +1,48 @@ +.q-error-page { + background-color: #373737; + color:#FFF; + font-family: Roboto, sans-serif; + text-align: center; +} + +a { + text-decoration: none; + text-transform: uppercase; + display: inline-block; + background-color: #F44336; + color:#FFF; + border-radius: 2px; + padding:10px 20px; + margin-top:40px; + font-weight: 300; +} + +.q-error-logo { + margin:40px; +} + +.q-error-title { + color:#F44336; + margin:20px 0; + text-align: center; + font-weight: 400; +} + +.q-error-subtitle { + margin:0; + text-align: center; + font-weight: 400; +} + +.q-error-image { + max-width: 80%; +} + +@media (max-width: 599px) { + .q-error-title { + font-size:20px; + } + .q-error-subtitle { + font-size:12px; + } +} \ No newline at end of file diff --git a/static/css/fonts/code_light.css b/static/css/fonts/code_light.css new file mode 100755 index 0000000..f86eefc --- /dev/null +++ b/static/css/fonts/code_light.css @@ -0,0 +1,12 @@ +@font-face { + font-family: 'Code Light'; + src: url('fonts/code_light/code_light-webfont.eot'); + src: url('fonts/code_light/code_light-webfont.eot?#iefix') format('embedded-opentype'), + url('fonts/code_light/code_light-webfont.woff2') format('woff2'), + url('fonts/code_light/code_light-webfont.woff') format('woff'), + url('fonts/code_light/code_light-webfont.ttf') format('truetype'), + url('fonts/code_light/code_light-webfont.svg#code_lightregular') format('svg'); + font-weight: normal; + font-style: normal; +} + diff --git a/static/css/fonts/code_light/code_light-webfont.eot b/static/css/fonts/code_light/code_light-webfont.eot new file mode 100755 index 0000000000000000000000000000000000000000..ec867ee41866de3f2bb867904e0e9f8a5ca494df GIT binary patch literal 12605 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 literal 0 HcmV?d00001 diff --git a/static/css/fonts/code_light/code_light-webfont.svg b/static/css/fonts/code_light/code_light-webfont.svg new file mode 100755 index 0000000..f2b9bcc --- /dev/null +++ b/static/css/fonts/code_light/code_light-webfont.svg @@ -0,0 +1,1743 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/static/css/fonts/code_light/code_light-webfont.ttf b/static/css/fonts/code_light/code_light-webfont.ttf new file mode 100755 index 0000000000000000000000000000000000000000..adef3b2dec11f76a8a92dbe77904f35538db85b7 GIT binary patch literal 33536 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 XH4aCl5!7Zw_yGh|?XSBB2+02f1*Ilz literal 0 HcmV?d00001 diff --git a/static/css/fonts/code_light/code_light-webfont.woff2 b/static/css/fonts/code_light/code_light-webfont.woff2 new file mode 100755 index 0000000000000000000000000000000000000000..a353aa4a192fbc62a41da90dfe9e998118aad649 GIT binary patch literal 11304 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 literal 0 HcmV?d00001 diff --git a/static/css/fonts/qarnot/qarnot.svg b/static/css/fonts/qarnot/qarnot.svg new file mode 100755 index 0000000..ec594f2 --- /dev/null +++ b/static/css/fonts/qarnot/qarnot.svg @@ -0,0 +1,17 @@ + + + +Generated by IcoMoon + + + + + + + + + + + + + \ No newline at end of file diff --git a/static/css/fonts/qarnot/qarnot.ttf b/static/css/fonts/qarnot/qarnot.ttf new file mode 100755 index 0000000000000000000000000000000000000000..70a71be917a5301a059445606914a22c6bfa7eb8 GIT binary patch literal 4936 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 literal 0 HcmV?d00001 diff --git a/static/css/fonts/qarnot/qarnot.woff b/static/css/fonts/qarnot/qarnot.woff new file mode 100755 index 0000000000000000000000000000000000000000..e70511ce4af5fcf70ebb4e7099dfcd11d29c3800 GIT binary patch literal 5012 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