Skip to content

Commit

Permalink
initial commit
Browse files Browse the repository at this point in the history
  • Loading branch information
vmakhaev committed Oct 7, 2014
0 parents commit 82f82c2
Show file tree
Hide file tree
Showing 33 changed files with 663 additions and 0 deletions.
5 changes: 5 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
.DS_Store
node_modules
npm-debug.log
.idea*
/public/derby
12 changes: 12 additions & 0 deletions .yo-rc.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
{
"generator-derby": {
"app": "derby login example",
"coffee": false,
"stylus": true,
"jade": false,
"project": "derby login example",
"apps": [
"app"
]
}
}
2 changes: 2 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
derby-login-example
=============
45 changes: 45 additions & 0 deletions apps/app/index.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
var derby = require('derby');

var app = module.exports = derby.createApp('app', __filename);

if (!derby.util.isProduction) global.app = app;

app.use(require('d-bootstrap'));
app.use(require('derby-login/components/auth'));
app.serverUse(module, 'derby-stylus');

app.loadViews(__dirname + '/views');
app.loadStyles(__dirname + '/styles');

app.get('*', function(page, model, params, next) {
if (model.get('_session.loggedIn')) {
var userId = model.get('_session.userId');
var $user = model.at('users.' + userId);
model.subscribe($user, function() {
model.ref('_session.user', $user);
next();
});
} else {
next();
}
});

app.get('/', function(page, model){
page.render('home');
});

app.get('/emailchangeconfirmed', function(page, model){
page.render('emailchangeconfirmed');
});

app.get('/registrationconfirmed', function(page, model){
page.render('registrationconfirmed');
});

app.proto.emailChanged = function(data) {
alert('Confirmation email is sent to ' + data.email);
}

app.proto.passwordChanged = function(data) {
alert('Password is changed');
}
Empty file added apps/app/styles/index.styl
Empty file.
2 changes: 2 additions & 0 deletions apps/app/views/emailchangeconfirmed.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
<index:>
<p>Email confirmed, thank you. <a href='/'>Go to app</a></p>
63 changes: 63 additions & 0 deletions apps/app/views/home.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
<index:>
<div class='row'>
<div class='col-sm-2 col-sm-offset-1'>
<p>UserId: {{_session.userId}}</p>
{{if _session.user.email}}
<p>Email: {{_session.user.email}}</p>
{{/}}
<p><a href='/auth/logout' class='btn btn-primary btn-block'>Logout with Link</a></p>
<p><view name='auth:logout' text='Logout with Ajax' /></p>
</div>
<div class='col-sm-2 col-sm-offset-1'>
{{if _session.user.email}}
<p>Change password:</p>
<view name='auth:changepassword' on-success='passwordChanged()' />
<br>
<p>Change email:</p>
<view name='auth:changeemail' on-success='emailChanged()' />
{{/}}
</div>
<div class='col-sm-2 col-sm-offset-1'>
<p>OAuth providers:</p>
<p>
Github:&nbsp;
{{if _session.user.github}}
<a href='{{_session.user.github.profileUrl}}' target='_blank'>{{_session.user.github.username}}</a>
{{else}}
<a href='/auth/github'>Register</a>
{{/}}
</p>
<p>
Google:&nbsp;
{{if _session.user.google}}
<a href='https://plus.google.com/{{_session.user.google.id}}' target='_blank'>{{_session.user.google.displayName}}</a>
{{else}}
<a href='/auth/google'>Register</a>
{{/}}
</p>
<p>
Twitter:&nbsp;
{{if _session.user.twitter}}
<a href='https://twitter.com/{{_session.user.twitter.username}}' target='_blank'>{{_session.user.twitter.displayName}}</a>
{{else}}
<a href='/auth/twitter'>Register</a>
{{/}}
</p>
<p>
Facebook:&nbsp;
{{if _session.user.facebook}}
<a href='{{_session.user.facebook.profileUrl}}' target='_blank'>{{_session.user.facebook.displayName}}</a>
{{else}}
<a href='/auth/facebook'>Register</a>
{{/}}
</p>
<p>
Vkontakte:&nbsp;
{{if _session.user.vkontakte}}
<a href='{{_session.user.vkontakte.profileUrl}}' target='_blank'>{{_session.user.vkontakte.displayName}}</a>
{{else}}
<a href='/auth/vkontakte'>Register</a>
{{/}}
</p>
</div>
</div>
15 changes: 15 additions & 0 deletions apps/app/views/index.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
<import: src='./emailchangeconfirmed'>
<import: src='./home'>
<import: src='./registrationconfirmed'>

<Title:>
{{_page.title}}

<Body:>
<view name="header"/>
<view name="{{$render.ns}}"/>

<header:>
<h1>App</h1>
<p>{{if _session.loggedIn}}loggedIn{{else}}notLoggedIn{{/}}</p>
<br>
2 changes: 2 additions & 0 deletions apps/app/views/registrationconfirmed.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
<index:>
<p>Registration confirmed, thank you. <a href='/'>Go to app</a></p>
9 changes: 9 additions & 0 deletions apps/error/index.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
var derby = require('derby');

var errorApp = module.exports = derby.createApp();

errorApp.serverUse(module, 'derby-stylus');

errorApp.loadViews(__dirname + '/views');
errorApp.loadStyles(__dirname + '/styles/index');
errorApp.loadStyles(__dirname + '/styles/reset');
9 changes: 9 additions & 0 deletions apps/error/styles/index.styl
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
body
padding: 2em

h1
font-size: 2em
margin-bottom: .5em

p
line-height: 2em
15 changes: 15 additions & 0 deletions apps/error/styles/reset.styl
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
body,h1,h2,h3,h4,input,pre,select,textarea,th
font: 13px/normal arial,sans-serif

body,fieldset,form,h1,h2,h3,h4,input,ul,li,ol,p,td,textarea,th
margin: 0
padding: 0

ul
margin: 0 normal

table
border-collapse: collapse

fieldset,img
border: 0
7 changes: 7 additions & 0 deletions apps/error/views/403.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
<Title:>
Forbidden

<Body:>
<h1>403</h1>
<p>Looks like you don't have permission to access <b>{{$render.url}}</b>.</p>
<p>Try heading back to the <a href="/">home page</a>.</p>
7 changes: 7 additions & 0 deletions apps/error/views/404.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
<Title:>
Not found

<Body:>
<h1>404</h1>
<p>Sorry, we can't find anything at <b>{{$render.url}}</b>.</p>
<p>Try heading back to the <a href="/">home page</a>.</p>
6 changes: 6 additions & 0 deletions apps/error/views/500.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
<Title:>
Internal server error

<Body:>
<h1>500</h1>
<p>Something went wrong on our end. Try giving us a minute to fix it and then <a href="javascript:window.location=window.location">reload your browser</a>.</p>
33 changes: 33 additions & 0 deletions apps/error/views/index.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
<import: src="./403">
<import: src="./404">
<import: src="./500">

<!--
This is a static template file, so it doesn't have an associated app.
It is rendered by the server via a staticPages renderer.
Since static pages don't include the Derby client library, they can't have
bound variables that automatically update. However, they do support initial
template tag rendering from a context object and/or model.
-->

<Head:>
<!-- This script is needed for Chrome, which doesn't go to the server
to get the page when the user clicks back if using push/pop state -->
<script>
window.onpopstate = function (e) {
var method = e.state && e.state.$method;
if (!method) return;
if (method === 'get') {
window.location = window.location;
} else {
window.history.back();
}
};
</script>

<Title:>
Unknown error

<Body:>
<h1>Unknown error</h1>
34 changes: 34 additions & 0 deletions apps/login/index.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
var derby = require('derby');

var app = module.exports = derby.createApp('login', __filename);

if (!derby.util.isProduction) global.app = app;

app.use(require('d-bootstrap'));
app.use(require('derby-login/components/notAuth'));
app.serverUse(module, 'derby-stylus');

app.loadViews(__dirname + '/views');
app.loadStyles(__dirname + '/styles');

app.get('/confirmregistration', function(page, model){
page.render('confirmregistration');
});

app.get('/recoverpassword', function(page, model, params){
var secret = params.query.secret;
model.set('_page.secret', secret);
page.render('recoverpassword');
});

app.get('/login', function(page, model){
page.render('login');
});

app.proto.passwordChanged = function(data) {
app.model.set('_page.passwordChanged', true);
}

app.proto.recoveryEmailSent = function(data) {
alert('Recovery email is sent to ' + data.email);
}
Empty file added apps/login/styles/index.styl
Empty file.
3 changes: 3 additions & 0 deletions apps/login/views/confirmregistration.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
<index:>
<p>Letter was sent to your email address</p>
<p>To finish registration follow the link in letter</p>
15 changes: 15 additions & 0 deletions apps/login/views/index.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
<import: src='./confirmregistration'>
<import: src='./login'>
<import: src='./recoverpassword'>

<Title:>
{{_page.title}}

<Body:>
<view name="header"/>
<view name="{{$render.ns}}"/>

<header:>
<h1>Login app</h1>
<p>{{if _session.loggedIn}}loggedIn{{else}}notLoggedIn{{/}}</p>
<br>
20 changes: 20 additions & 0 deletions apps/login/views/login.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
<index:>
<div class='row'>
<div class='col-sm-2 col-sm-offset-1'>
<view name='auth:login' />
<br>
<p>Forgot password?</p>
<view name='auth:recoverpassword' on-success='recoveryEmailSent()' />
</div>
<div class='col-sm-2 col-sm-offset-1'>
<view name='auth:register' />
</div>
<div class='col-sm-2 col-sm-offset-1'>
<p>Login or Register with providers:</p>
<p><a href='/auth/github'>Github</a></p>
<p><a href='/auth/google'>Google</a></p>
<p><a href='/auth/twitter'>Twitter</a></p>
<p><a href='/auth/facebook'>Facebook</a></p>
<p><a href='/auth/vkontakte'>Vkontakte</a></p>
</div>
</div>
10 changes: 10 additions & 0 deletions apps/login/views/recoverpassword.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
<index:>
<div class='row'>
<div class='col-sm-2 col-sm-offset-1'>
{{if _page.passwordChanged}}
<p>Password is changed, <a href='/login'>Go to login page</a></p>
{{else}}
<view name='auth:resetpassword' secret='{{_page.secret}}' on-success='passwordChanged()' />
{{/}}
</div>
</div>
12 changes: 12 additions & 0 deletions bcrypt.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
var bcrypt = require('bcrypt');

module.exports = function(costFactor) {
return {
compare: function(password, hash, salt, done) {
bcrypt.compare(password, hash, done);
},
hash: function(password, done) {
bcrypt.hash(password, costFactor, done);
}
}
}
7 changes: 7 additions & 0 deletions config/defaults.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
{
"NODE_ENV": "development",
"PORT": 3000,
"MONGO_URL": "mongodb://localhost:27017/derby-login-example",
"SESSION_SECRET": "0f83db8c6b9ecc8e761eb16080ebf734ceb73d80",
"SESSION_COOKIE": "b5355e697ac2e2833e74dc57d9e8e83151662378"
}
Loading

0 comments on commit 82f82c2

Please sign in to comment.