Skip to content

Vytvořena stránka uživatele #93

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 7 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions app.coffee
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,9 @@ app.configure 'development', ->

app.get '/', routes.index

app.get '/user', routes.user
app.post '/user/password', routes.user_password

app.get '/course/:courseName', routes.course

app.get '/sandbox', routes.sandbox
Expand Down
4 changes: 3 additions & 1 deletion progma/passport.coffee
Original file line number Diff line number Diff line change
Expand Up @@ -71,8 +71,10 @@ exports.localAuth = ->

# Check password.
shasum = crypto.createHash 'sha1'
shasum.update "" + user.salt
shasum.update password
if shasum.digest('hex') != user.password
hash = shasum.digest('hex')
if hash != user.password
return done null, false, { message: 'Invalid password' }

# Return user profile.
Expand Down
1 change: 1 addition & 0 deletions public/courses/turtle1/course.json
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
{
"readableName": "Želvička",
"mediaRoot": "/media/turtle1/",
"lectures": [
{
Expand Down
1 change: 1 addition & 0 deletions public/courses/turtle1b/course.json
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
{
"readableName": "Želvička",
"mediaRoot": "/media/turtle1b/",
"lectures": [
{
Expand Down
1 change: 1 addition & 0 deletions public/courses/turtle2/course.json
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
{
"readableName": "3D Želvička",
"mediaRoot": "/media/turtle2/",
"lectures": [
{
Expand Down
5 changes: 5 additions & 0 deletions public/less/course.less
Original file line number Diff line number Diff line change
Expand Up @@ -292,3 +292,8 @@
height: 32px;
background-color: @filmStock;
}

.affix {
top: 70px;
width: 170px;
}
144 changes: 143 additions & 1 deletion public/stylesheets/bootstrap.min.css

Large diffs are not rendered by default.

53 changes: 52 additions & 1 deletion routes/index.coffee
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
crypto = require('crypto')
settings = require('../progma/settings')
users = require('../progma/users')
db = require('../progma/mongo').db
fs = require('fs')

userCodeCollection = db.collection('userCode')


Expand Down Expand Up @@ -92,6 +95,50 @@ exports.login = (req, res) ->
user: req.user
errors: req.flash 'error'

exports.user = (req, res) ->
lectures = {}
for courseName of req.user.lecturesDone
file = fs.readFileSync('public/courses/' + courseName + '/course.json')
course = JSON.parse(file)

lectures[courseName] = {readableName: course['readableName'], list: []}

for lectureName of course['lectures']
lecture = course['lectures'][lectureName]
lectures[courseName]['list'].push({
name: lecture['name']
readableName: lecture['readableName']
done: lecture['name'] in req.user.lecturesDone[courseName]
})

console.log(lectures)

res.render 'user',
title: 'User'
page: 'user'
user: req.user
lectures: lectures
errors: req.flash 'error'

exports.user_password = (req, res) ->
if req.user?
old_password = req.body.old_password
new_password = req.body.new_password
confirm = req.body.confirm_new_password

users.checkPassword req.user.id, old_password, (err, correct) ->
if correct
users.getUser req.user.id, (err, user) ->
# Create salt and password
user.salt = new Date().getTime()
user.password = users.hashPassword(user.salt, new_password)
users.updateUser user, ->
res.redirect '/user'
else
res.redirect 'back'
else
res.redirect 'back'

exports.get_register = (req, res) ->
res.render 'register',
title: 'Registration'
Expand All @@ -115,15 +162,19 @@ exports.post_register = (req, res, next, passport) ->
req.flash 'error', 'User already exists.'
return res.redirect '/login'

salt = new Date().getTime()
# Compute password hash.
shasum = crypto.createHash 'sha1'
shasum.update "" + salt
shasum.update req.body.password
hash = shasum.digest('hex')

# Create new user profile.
new_user =
id: username
salt: salt
displayName: req.body.username
password: shasum.digest 'hex'
password: hash

# Insert new user to database.
db.collection('users').save new_user, (err, result) ->
Expand Down
2 changes: 1 addition & 1 deletion views/layout.jade
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ html(lang="en")

if user
ul.nav.pull-right
li: a(href="/account") #{user.displayName}
li: a(href="/user") #{user.displayName}
li: a(href="/logout") logout
else
ul.nav.pull-right
Expand Down
63 changes: 63 additions & 0 deletions views/user.jade
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
extends layout

block body
section
.page-header
h1 Detaily uživatele
.row
.span2
div(data-spy="affix", data-offset-top="100")
ul.nav.nav-tabs.nav-stacked#side-menu
li
a(href="#progress") Splněné kurzy
li
a(href="#settings") Změna nastavení

.span10
.row
.span4
h2#progress Splněné kurzy
.row
.span10
each val, key in lectures
.span3
h3 #{val.readableName}
ul(style="list-style: none")
each lecture, name in val['list']
if lecture['done']
li
i.icon-check
a(href="/course/#{key}##{lecture.name}") #{lecture.readableName}
else
li
i.icon-check-empty
a(href="/course/#{key}##{lecture.name}") #{lecture.readableName}
hr
.row
.span4
h2#settings Změna nastavení
.row
.span4
form.well(action="/user/password", method="post")
fieldset
.control-group
label.control-label(for="old_password") Staré heslo:
.controls
input(style="height: 35px; box-sizing:border-box; width: 100%;",
type="password",
name="old_password")
.control-group
label.control-label(for="new_password") Nové heslo:
.controls
input(style="height: 35px; box-sizing:border-box; width: 100%;",
type="password",
name="new_password")
.control-group
label.control-label(for="new_password") Potvrdit nové heslo:
.controls
input(style="height: 35px; box-sizing:border-box; width: 100%;",
type="password",
name="confirm_new_password")
.control-group
.controls
button.btn.btn-large.btn-primary(type="submit") Odeslat