From 057f498e03609aafdf52aefa2c32d7660a66ade1 Mon Sep 17 00:00:00 2001 From: piatra Date: Sun, 21 Jul 2013 13:36:01 +0300 Subject: [PATCH 1/4] new signing process --- app.js | 15 ++ lib/asset.js | 72 ++++++- lib/asset.simple.cfg | 7 +- lib/db.js | 49 +++-- lib/keys.js | 3 +- lib/listing | 30 +++ lib/listing.simple.cfg | 12 +- lib/payswarm.cfg | 12 +- lib/ref | 3 + lib/schemas.js | 29 +-- lib/user.js | 1 - output | 204 ++++++++++++++++++++ package.json | 4 + public/javascripts/event-assets.js | 2 +- public/javascripts/event-handlers.js | 6 +- public/javascripts/event-login.js | 2 +- public/javascripts/test.txt | 49 +++++ public/stylesheets/style.css | 26 ++- public/stylesheets/style.styl | 25 ++- public/stylesheets/topcoat-mobile-light.css | 10 +- routes/assets.js | 102 +++++++++- routes/auth.js | 21 +- routes/index.js | 25 ++- routes/user.js | 19 ++ test.js | 33 ++++ test.txt | 49 +++++ views/index.jade | 39 ++-- views/layout.jade | 11 +- views/newasset.jade | 110 ++++++----- 29 files changed, 819 insertions(+), 151 deletions(-) create mode 100644 lib/listing create mode 100644 lib/ref create mode 100644 output create mode 100644 public/javascripts/test.txt create mode 100644 routes/user.js create mode 100644 test.js create mode 100644 test.txt diff --git a/app.js b/app.js index 848c50f..004a316 100644 --- a/app.js +++ b/app.js @@ -8,6 +8,7 @@ var express = require('express') , assets = require('./routes/assets') , auth = require('./routes/auth') , http = require('http') + , user = require('./routes/user') , path = require('path'); var app = express(); @@ -33,6 +34,9 @@ app.configure('development', function(){ }); app.get('/', routes.index); + +app.post('/user/set/username', user.setUsername); + app.post('/auth/verify', auth.verify); app.get('/auth/createKeyPair', auth.createKeyPair); app.post('/payswarm/register', auth.registerKey); @@ -45,6 +49,17 @@ app.post('/newasset/save', assets.saveAsset); app.get('/assets/created', assets.getUserAssets); app.get('/assets/:count', assets.getLatestAssets); +app.get('/assets/asset/:id', assets.getAsset); +app.get('/listings/listing/:id', assets.getListing); + +app.get('/asset/content/:id', function (req, res){ + res.end('The content!'); +}); + +app.get('/assets/:id/purchase', assets.purchase); + +app.get('/decrypt/:type/:id', assets.decrypt); + http.createServer(app).listen(app.get('port'), function(){ console.log("Express server listening on port " + app.get('port')); }); diff --git a/lib/asset.js b/lib/asset.js index 8868e26..1f466d2 100644 --- a/lib/asset.js +++ b/lib/asset.js @@ -6,7 +6,8 @@ var _ = require('underscore'), utils = require('../lib/utils')(), payswarm = require('payswarm'), mongoose = require('mongoose'), - db = require('../lib/db') + db = require(__dirname + '/db.js'), + host = 'webpayments.fwd.wf'; ; module.exports = function (options) { @@ -136,6 +137,40 @@ module.exports = function (options) { db.save.asset(graph, cb); } + function getOne (query, cb) { + getOneAsset(query, function (asset) { + getOneListing({'assetId': query['_id']}, function (listing) { + var assetAndListing = { + "@context": 'https://w3id.org/payswarm/v1', + "@graph": [asset[0], listing[0]] + } + cb(assetAndListing); + }); + }); + } + + function getOneAsset (query, cb) { + db.get.asset(query, function (err, doc) { + if (err) { + console.log('Error getting one asset' + err); + cb({}); + } else { + cb(doc); + } + }); + } + + function getOneListing (query, cb) { + db.get.listing(query, function (err, doc) { + if (err) { + console.log('Error getting one listing' + err); + cb({}); + } else { + cb(doc); + } + }); + } + function getUserAssets (query, cb) { db.get.userAssets(query, function (err, assets) { if (err) { @@ -144,6 +179,7 @@ module.exports = function (options) { } else { var docs = []; var l = assets.length; + if(!l) cb(docs); assets.forEach(function (asset) { db.get.userListings(asset['_id'], function (err, doc) { if (err) { @@ -164,10 +200,44 @@ module.exports = function (options) { }) } + function getListing (query, cb) { + console.log('query', arguments); + var errMsg = {'error': 'Listing not found'}; + db.get.listing(query, function (err, doc) { + if (err || !doc.length) { + console.log(err); + cb(errMsg); + } else { + // FIXME + doc[0].asset = 'http://'+host+'/assets/asset/' + doc[0]['assetId']; + doc[0].id = 'http://'+host+'/listings/listing/' + doc[0]['_id']; + cb(doc[0] || errMsg); + } + }); + } + + function getAsset (query, cb) { + var errMsg = {'error': 'Asset not found'}; + db.get.asset(query, function (err, doc) { + if (err || !doc.length) { + console.log(err); + cb(errMsg); + } else { + doc[0].assetContent = 'http://'+host+'/asset/content/' + doc[0]['_id']; + doc[0].id = 'http://'+host+'/assets/asset/' + doc[0]['_id']; + cb(doc[0] || errMsg); + } + }); + } + // sign is a facade for creating + signing assetUtils.sign = sign; assetUtils.save = saveAssetAndListing; assetUtils.getUserAssets = getUserAssets; + assetUtils.getOne = getOne; + assetUtils.getListing = getListing; + assetUtils.getAsset = getAsset; + assetUtils.getOneListing = getOneListing; return assetUtils; }; \ No newline at end of file diff --git a/lib/asset.simple.cfg b/lib/asset.simple.cfg index b1b6be2..3242c32 100644 --- a/lib/asset.simple.cfg +++ b/lib/asset.simple.cfg @@ -1,6 +1,7 @@ { "@context": "https://w3id.org/payswarm/v1", - "id": "http: //listings.dev.payswarm.com/mozhacks/demo#asset", + "id": "http://listings.dev.payswarm.com/mozhacks/demo#asset", + "userId": "~", "type": [ "Asset" ], @@ -8,6 +9,6 @@ "fullName": "DeveloperJoe" }, "title": "MozillaHacksDemoAsset", - "assetContent": "http: //listings.dev.payswarm.com/mozhacks/demo#asset", - "assetProvider": "https: //dev.payswarm.com/i/YOUR_IDENTITY_HERE" + "assetContent": "http://listings.dev.payswarm.com/mozhacks/demo#asset", + "assetProvider": "https://dev.payswarm.com/i/YOUR_IDENTITY_HERE" } \ No newline at end of file diff --git a/lib/db.js b/lib/db.js index 68c382f..037dcd1 100644 --- a/lib/db.js +++ b/lib/db.js @@ -1,12 +1,21 @@ var mongoose = require('mongoose'); +var _ = require('underscore'); if (process.env.NODE_ENV) var db = mongoose.connect('mongodb://nodejitsu:c0a886dafe2c7d59cfc1d0d62e61ebff@dharma.mongohq.com:10074/nodejitsudb4747069906'); else - var db = mongoose.connect('mongodb://localhost:27017/webpayments'); + var db = mongoose.connect('mongodb://localhost:27017/webpay'); var schemas = require('./schemas')(db); +function assert() { + argv = _.toArray(arguments); + if(!argv[0]) { + console.log(argv[2]); + throw new Error('Expected ' + argv[1] + ' to be defined'); + } +} + var dbUtils = { find: function (schema, query, fields, cb) { if (typeof fields === 'function') { @@ -26,21 +35,31 @@ var dbUtils = { } }, save : { - asset : function (graph, cb) { + asset: function (graph, cb) { var listing = new schemas.Listing(graph.listing); - console.log(graph.asset); var asset = new schemas.Asset(graph.asset); - asset.save(function (err, d) { - if (err) cb(err); - else { - listing.assetId = d['_id']; + asset.userId = listing.userId; + asset.listingId = listing._id; + listing.assetId = asset._id; + + assert(asset.userId, 'listing', asset); + assert(listing.userId, 'user id', listing); + assert(listing._id, 'listing id', listing); + + asset.save(function (err) { + if (err) { + cb(err); + } else { listing.save(function (err) { - if (err) cb(err); - else cb(null); + if (err) { + cb(err); + } else { + cb(null); + } }) } - }); + }) } }, findOne: { @@ -67,6 +86,12 @@ var dbUtils = { user: function (fields, user, cb) { schemas.User.findOne(user, fields, dbUtils.next(cb)); }, + asset: function (query, cb) { + schemas.Asset.find(query, dbUtils.next(cb)); + }, + listing: function (query, cb) { + schemas.Listing.find(query, dbUtils.next(cb)); + }, userAssets: function (query, cb) { dbUtils.get.user({ owner: 1 @@ -75,10 +100,8 @@ var dbUtils = { console.log(err); cb(err); } else { - console.log(doc); - console.log(query); schemas.Asset.find({ - assetProvider: doc.owner + assetProvider: (doc) ? doc.owner : [] }, dbUtils.next(cb)); } }) diff --git a/lib/keys.js b/lib/keys.js index b782615..6fea608 100644 --- a/lib/keys.js +++ b/lib/keys.js @@ -17,7 +17,8 @@ module.exports = function(opts) { console.log('Error reading keys: ', err); } else { keyPair = JSON.parse(data); - payswarm.decrypt(encryptedMessage, {privateKey: keyPair.privateKeyPem}, cb); + console.log('PRIVATE KEY PEM', keyPair); + payswarm.decrypt(encryptedMessage, {privateKey: keyPair.publicKey.privateKeyPem}, cb); } }); } diff --git a/lib/listing b/lib/listing new file mode 100644 index 0000000..72647ab --- /dev/null +++ b/lib/listing @@ -0,0 +1,30 @@ +{ + "@context": "https://w3id.org/payswarm/v1", + "id": "http://listings.dev.payswarm.com/mozhacks/html5-me-song#listing", + "userId": "~", + "type": ["Listing"], + "vendor": "https://dev.payswarm.com/i/the-webdevs", + "payee": [{ + "type": "Payee", + "destination": "https://dev.payswarm.com/i/the-webdevs/accounts/royalties", + "payeeGroup": ["vendor"], + "payeeRateType": "FlatAmount", + "payeeRate": "1.00", + "currency": "USD", + "payeeApplyType": "ApplyExclusively", + "comment": "Payment to The Webdevs for creating the HTML5 Me, Baby song" + }], + "payeeRule": [{ + "type": "PayeeRule", + "payeeGroupPrefix": ["authority"], + "payeeRateType": "Percentage", + "maximumPayeeRate": "5", + "payeeApplyType": "ApplyInclusively" + }], + "asset": "http://listings.dev.payswarm.com/mozhacks/html5-me-song#asset", + "assetHash": "assetHash", + "license": "https://w3id.org/payswarm/licenses/personal-use", + "licenseHash": "urn:sha256:d9dcfb7b3ba057df52b99f777747e8fe0fc598a3bb364e3d3eb529f90d58e1b9", + "validFrom": "date", + "validUntil": "date" +} \ No newline at end of file diff --git a/lib/listing.simple.cfg b/lib/listing.simple.cfg index 2def8f1..755765c 100644 --- a/lib/listing.simple.cfg +++ b/lib/listing.simple.cfg @@ -1,11 +1,12 @@ { "@context": "https://w3id.org/payswarm/v1", "id": "http://listings.dev.payswarm.com/mozhacks/html5-me-song#listing", + "userId": "~", "type": ["Listing"], - "vendor": "https://dev.payswarm.com/i/the-webdevs", + "vendor": "https://dev.payswarm.com/i/webpayments", "payee": [{ "type": "Payee", - "destination": "https://dev.payswarm.com/i/the-webdevs/accounts/royalties", + "destination": "https://dev.payswarm.com/i/webpayments/accounts/primary", "payeeGroup": ["vendor"], "payeeRateType": "FlatAmount", "payeeRate": "1.00", @@ -22,8 +23,13 @@ }], "asset": "http://listings.dev.payswarm.com/mozhacks/html5-me-song#asset", "assetHash": "assetHash", + "listing": "listing", "license": "https://w3id.org/payswarm/licenses/personal-use", "licenseHash": "urn:sha256:d9dcfb7b3ba057df52b99f777747e8fe0fc598a3bb364e3d3eb529f90d58e1b9", + "listingHash": "whatev", + "nonce":"123123123", + "transactionId":"123789", "validFrom": "date", - "validUntil": "date" + "validUntil": "date", + "identity":"1" } \ No newline at end of file diff --git a/lib/payswarm.cfg b/lib/payswarm.cfg index fca8a7d..475388a 100644 --- a/lib/payswarm.cfg +++ b/lib/payswarm.cfg @@ -1,8 +1,8 @@ { - "@context": "https://w3id.org/payswarm/v1", - "publicKey": { - "id":"https://dev.payswarm.com/i/authority/keys/1", - "publicKeyPem": "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAy1YIKTq3QyulsAabwMth\nr6SA1tuTz7dHG3suBGCOi8Lz/HcsvKab42WEwJ3cNxPCmslNUB2768CoIpLLQmlL\nlps/MILFM/XB6XNP7vjhRj2KbT+OCISPSZWgT2GoB0P5iYTVIeXCSRJlbFnxECyz\nEcE+tGITtdNHaQvvktxrFBl3PN5Ukx6L8YpDepj1rQMPHWzutVnK95r5D3O97dEO\nNzcq9T4CvkwBgLrrbFoWGzBjzxQfn5Bjl4sf0TDZRVEkm2V0R9NzwNf3sYuuN/1t\n/K5gvf18ieKgjp1KzHfOvJ9vKfycKwVK/T1sXLyifUlSIcdnzRenPK94/Ns2jvh8\nnQIDAQAB\n-----END PUBLIC KEY-----\n", - "privateKeyPem": "-----BEGIN RSA PRIVATE KEY-----\nMIIEpAIBAAKCAQEAy1YIKTq3QyulsAabwMthr6SA1tuTz7dHG3suBGCOi8Lz/Hcs\nvKab42WEwJ3cNxPCmslNUB2768CoIpLLQmlLlps/MILFM/XB6XNP7vjhRj2KbT+O\nCISPSZWgT2GoB0P5iYTVIeXCSRJlbFnxECyzEcE+tGITtdNHaQvvktxrFBl3PN5U\nkx6L8YpDepj1rQMPHWzutVnK95r5D3O97dEONzcq9T4CvkwBgLrrbFoWGzBjzxQf\nn5Bjl4sf0TDZRVEkm2V0R9NzwNf3sYuuN/1t/K5gvf18ieKgjp1KzHfOvJ9vKfyc\nKwVK/T1sXLyifUlSIcdnzRenPK94/Ns2jvh8nQIDAQABAoIBAGkh0VRn7GtJfQB3\nWj6jqZ1kA82TeGhUjepylQdkWS+AHCC0Cah8yGsZiTsCI+NCT0Myw8uhpBEv6n79\nwSRURuXW3SQa6RWFgr5Ohcy8V9W2agU0cB6NU3yrZVjF2FfxWGs3B+/f2MVpQpF0\nK4S+Z9PNQ7uGXkSLugdhSXx4hNC9sKbz+mODcC6cHB7EUYlua7gRNWwt05ACEOvc\n6qx5xEKL+0tvgO+lWgj9IUggReGhexck4r3lGin4bwUzl/hAex0Ki+dZ19LlfseJ\ne1FGzN38l4/VA09c62gXD3syaU0n/QRWDRIbsJ/mWoT86nRKcfm6bsg+NujUqKTc\ns3//TK0CgYEA/n1+TpNfw6D79x0m4PE5zX01iGFxle8jnxwX3q84/H1WDibRL9P5\nppwSIT0frINXQMpB02PAU2rFuQXgXqH2PPcdbGwziNq4JDE3k7TPwmM2O4zY+v6U\nNZV6OhVbfAHMpKJs47Qgvc7GsruHT2vy0/ChFnmJlFLONNuvOqXkQ8sCgYEAzIrZ\nJF3CssCfvqhP4Jst4ymU0hqdqg2dLAwUd0zieudpSr60aXRVaN/3aYoYWNoh+fAR\nc1rbdpMH1Rl1UsWPgd9VY2b2eyXZGVqwDl+X97PHoH5MEBDUvzQTyOsii3DMM69F\nER7o0nLSPigF+1Ki3TOxT2ExFCMcsJ1s+/VERDcCgYEAkhuGeqJN5sj0IAnSmm6k\nGv/5zhTz23ryXpUId0buVre2wmUy0FzJBgiwt/iZyLeXTpFQfYbVko7IedOP34Tp\nFFNjxy3P4JCCC/VdzSWP6jB/oGza3i9u89yf0d0VKvr1fMfr8EcoTRD8Lv1PUB/P\nyDJsqbSZcligHuTJk8hOZ0UCgYBWFxrN86i/E9Qoqy7zmlz1/8pjpFA4AwLkRzFW\nBUZN9JicnSfSOuS3/4xjH3yf6S/jwueVZeh5P+lMCCsZa427XATUkcGsk4GM6l6v\nrgyIdWLQalgZavwgfgrVxiIEDrXkCyFG03urGCjlgHMEFQP3lopKnt3JW/33WEtG\nwTS6gQKBgQCXpqWfp0lbj6AHYnEG5cOClVM0KJyyLtOVZ8Dy6YHQTHT2/VVk6SO5\nr5E+DvkwUAbBTU1uVP4+xmgZfVfIAyT97IzznLTkQ9truUTO//2H1A+L4e59iWzs\n/b4RkeAa3WXSNPXATBOE3eL/af11QRo95CPWrXJS4JVMEuVZeDHapA==\n-----END RSA PRIVATE KEY-----\n" - } + "@context": "https://w3id.org/payswarm/v1", + "publicKey": { + "id": "https://dev.payswarm.com/i/authority/keys/1", + "privateKeyPem": "-----BEGIN RSA PRIVATE KEY-----\nMIIEowIBAAKCAQEAtwAuVHB6gddoZUT4WdGqXAdr2YnnKIzxyYxPQubeQ2+y7ZLG\njov9xYVhM/avm4NTRPili1NK5tyo8MQSAXbWNQMu7vYMuc5+CCpFpm1LrnQ4sWsR\nvaWSWNkFBZ8FGvcW7Yte/mefT+du1JBeB/eoafaK5qBQNj7qmNytvyDzOtxEtHUj\nJt9xfS2Jbox9j3MLHifEUMeoD5YErNjqOlVH98OT8x0cUCmbO6ujwD0Hd2RPh1If\nb+Q6Fp6XbLdu/36RL9SCSgRssCyVyvbcyTBemNHeRu/9J/G14qXW/SpyxnP7zmGP\nNX7ksnxG7gBj15zD03kzxrbaU5LObgI3bdDFXwIDAQABAoIBAC5/cUYrPjV3kiMJ\nH0FTMMIpcJHZpE59YYIgkJMjLh5cZ05OGP1nPJfPiB838u7Es4e21flMtJ9sOdDT\nQO/2Tf8yS96Tzi/387YHZ6Md6jjtduo9lkhlpYXFvqzq9tUfK0g4PW7OzX/0Agko\nlXvYxYYHCswGt9rQqbMlf1AtAyBVIXFklGTRFhfoveJ6smJABIabEgBIcz4jZxxd\nclSYjD2rEkPG60zWvfrjWhmN+NHINi/TrhruX40L74vJOjKAGtbQt+DHZ/8fDXe3\nNFVMFGIKyP1mw072g+797mfe1dJ7okk2Qgu/ea6FfiikDajdo3zpcO13Gyg4Pg2O\nbawGy4ECgYEA2ayQMTXqkA+fhlLmCMsAy0JUX1A6adkKJrRbP5EKUJKOIFxM7Bv1\n/FchyeTaL0XayWQ7rVN+8oBbo0FMpN23Hciw9wduNf+N7/QmGAy3JBl84EpXkbJb\nxxjax7f7VZPmeiR12d67fZ5i1mKeu4pssmbYN05Uv5htIq3DV2i4Vg8CgYEA1zjA\nRGIk/FjZYFhWAjB0W+vSCEdqsMxd6WmCLP9XIR2j5V71WE1ChTmAvBRzmI0GS8dP\nTFA6UY7UId0vS1XUSE/mn5d1q9vdXN1S0+rlL7QLlUJlH20SSnPrMxf3f1JiYyZQ\nobEDZWMxiOzBD5j1lOvIzl3RNvea573XBfxLa7ECgYEAjFNTrXXNnkuEEqsUgqyj\n+WTsUXm9/oido6/3dzZAiQrBtxjpufiYjrF5Jddz1K/ayKPmWOmP2DNpYAhzqYEJ\nUJkVhFr08LirvvoNKMnhstL/jvQ+Gb36rpJWUBRKYbP0C9+/XdHZ2rSlkQGIxOwL\nAMOONbE4rz9Lc+TDHnFzDH8CgYBtKnILvaR5AzAveF8X+S/sOC9u15q8Vs0Dyeqn\nnFS7jWdGvuW/hmDJZqNvwwfnRxD8evo0ATWzjLj4/FIy6jQlAbI/HPoo0/ryUajj\nqO/bRH3jlavpRs/SR/3zCqMVR9pz5Eld2oWYdbn4c+5xVOqsQPS4CEpIkUtXZKme\ndZxj4QKBgC6kn+elzr/if37W+eZbTyo7WhrRJqGttAs72isE5mL9ewijqFNjXC2y\nJHTKaBpBKv3RfOMCTCx/w5F+ONIY3VkePWEnEbcAI2Iy72DKP3imU8O0Sr5bVkDC\nPkvLiFTrq+kK7I6xuJfbYO/SIRIfN7PQsaAaymX10YQnuUYatTea\n-----END RSA PRIVATE KEY-----\n", + "publicKeyPem": "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAtwAuVHB6gddoZUT4WdGq\nXAdr2YnnKIzxyYxPQubeQ2+y7ZLGjov9xYVhM/avm4NTRPili1NK5tyo8MQSAXbW\nNQMu7vYMuc5+CCpFpm1LrnQ4sWsRvaWSWNkFBZ8FGvcW7Yte/mefT+du1JBeB/eo\nafaK5qBQNj7qmNytvyDzOtxEtHUjJt9xfS2Jbox9j3MLHifEUMeoD5YErNjqOlVH\n98OT8x0cUCmbO6ujwD0Hd2RPh1Ifb+Q6Fp6XbLdu/36RL9SCSgRssCyVyvbcyTBe\nmNHeRu/9J/G14qXW/SpyxnP7zmGPNX7ksnxG7gBj15zD03kzxrbaU5LObgI3bdDF\nXwIDAQAB\n-----END PUBLIC KEY-----\n" + } } \ No newline at end of file diff --git a/lib/ref b/lib/ref new file mode 100644 index 0000000..4b1a27b --- /dev/null +++ b/lib/ref @@ -0,0 +1,3 @@ +Public Key Owner : https://dev.payswarm.com/i/piatra + Financial Account: https://dev.payswarm.com/i/piatra/accounts/primary + Public Key URL : https://dev.payswarm.com/i/piatra/keys/30 diff --git a/lib/schemas.js b/lib/schemas.js index c28322a..40b7d82 100644 --- a/lib/schemas.js +++ b/lib/schemas.js @@ -9,10 +9,12 @@ var UserSchema = new Schema({ }, publicKeyUrl : String, owner : String, - destination : String + destination : String, + username: String }); var AssetSchema = { + "@context": String, id: String, type: Array, creator: { @@ -21,12 +23,17 @@ var AssetSchema = { title: String, assetContent: String, assetProvider: String, - signature : Object + signature : Object, + description: String, + userId: String, + listingId: Schema.Types.ObjectId }; + var ListingSchema = { + "@context": String, id: String, - assetId: Schema.Types.ObjectId, + userId: String, type: Array, vendor: String, payee: Array, @@ -37,18 +44,16 @@ var ListingSchema = { licenseHash: String, validFrom: Date, validUntil: Date, - signature: Object + signature: Object, + assetId: Schema.Types.ObjectId, + userId: String } module.exports = function (db) { var schemes = {}; - var Listing = mongoose.model('Listing', ListingSchema); - var Asset = mongoose.model('Asset', AssetSchema); - var User = mongoose.model('User', UserSchema); + schemes.Listing = mongoose.model('Listing', ListingSchema); + schemes.Asset = mongoose.model('Asset', AssetSchema); + schemes.User = mongoose.model('User', UserSchema); - return { - Listing: Listing, - Asset: Asset, - User: User - }; + return schemes; } \ No newline at end of file diff --git a/lib/user.js b/lib/user.js index 229338d..490e3e6 100644 --- a/lib/user.js +++ b/lib/user.js @@ -5,7 +5,6 @@ module.exports = function (opts) { var userUtils = {}; function checkUser (json, cb) { - console.log(db); db.findOne.user({email : json.email}, cb); } diff --git a/output b/output new file mode 100644 index 0000000..7145363 --- /dev/null +++ b/output @@ -0,0 +1,204 @@ +Express server listening on port 3000 +new asset undefined +GET /newasset 200 475ms - 2.08kb +GET /javascripts/libs/require.js 304 60ms +GET /images/signin.png 304 30ms +GET /stylesheets/topcoat-mobile-light.css 304 28ms +GET /stylesheets/style.css 200 129ms - 4.21kb +serving index +GET / 200 67ms - 1.81kb +GET /javascripts/libs/require.js 304 6ms +GET /images/signin.png 304 6ms +GET /stylesheets/topcoat-mobile-light.css 304 7ms +GET /stylesheets/style.css 304 4ms +new asset undefined +GET /newasset 304 100ms +GET /javascripts/libs/require.js 304 6ms +GET /images/signin.png 304 6ms +GET /stylesheets/topcoat-mobile-light.css 304 5ms +GET /stylesheets/style.css 304 5ms +GET /javascripts/main.js 304 10ms +GET /javascripts/main.js 304 2ms +GET /javascripts/app.js 304 4ms +GET /javascripts/event-handlers.js 304 2ms +GET /javascripts/app.js 304 4ms +GET /javascripts/message.js 304 2ms +GET /javascripts/event-assets.js 304 2ms +GET /javascripts/event-login.js 304 1ms +GET /javascripts/event-handlers.js 304 1ms +GET /javascripts/modal.js 304 1ms +GET /javascripts/message.js 304 3ms +GET /javascripts/event-assets.js 304 2ms +GET /javascripts/event-login.js 304 1ms +GET /javascripts/modal.js 304 1ms +new asset undefined +GET /newasset 200 85ms - 2.08kb +GET /javascripts/libs/require.js 200 26ms - 14.65kb +GET /images/signin.png 200 25ms - 1.95kb +GET /stylesheets/topcoat-mobile-light.css 200 25ms - 25.94kb +GET /stylesheets/style.css 200 25ms - 4.21kb +GET /javascripts/main.js 200 2ms - 50 +GET /javascripts/app.js 200 1ms - 133 +GET /javascripts/event-handlers.js 200 1ms - 991 +GET /javascripts/message.js 200 2ms - 773 +GET /javascripts/event-login.js 200 4ms - 1.29kb +GET /javascripts/event-assets.js 200 4ms - 2.1kb +GET /javascripts/modal.js 200 13ms - 1.21kb +new asset undefined +GET /newasset 304 83ms +new asset undefined +GET /newasset 200 118ms - 2.08kb +GET /javascripts/libs/require.js 304 26ms +GET /images/signin.png 304 26ms +GET /stylesheets/topcoat-mobile-light.css 304 26ms +GET /stylesheets/style.css 304 59ms +GET /javascripts/libs/require.js 200 7ms - 14.65kb +GET /images/signin.png 200 7ms - 1.95kb +GET /stylesheets/topcoat-mobile-light.css 200 7ms - 25.94kb +GET /stylesheets/style.css 200 8ms - 4.21kb +new asset undefined +GET /newasset 200 81ms - 2.08kb +GET /stylesheets/topcoat-mobile-light.css 200 1ms - 25.94kb +GET /javascripts/libs/require.js 200 8ms - 14.65kb +GET /images/signin.png 200 8ms - 1.95kb +GET /stylesheets/style.css 200 11ms - 4.21kb +GET /javascripts/main.js 304 2ms +GET /javascripts/app.js 304 2ms +GET /javascripts/event-handlers.js 304 1ms +GET /javascripts/message.js 304 1ms +GET /javascripts/event-assets.js 304 2ms +GET /javascripts/event-login.js 304 2ms +GET /javascripts/modal.js 304 5ms +GET /assets/5 200 10ms - 2 +GET /javascripts/main.js 200 16ms - 50 +GET /javascripts/app.js 200 1ms - 133 +GET /javascripts/event-handlers.js 200 1ms - 991 +GET /javascripts/message.js 200 1ms - 773 +GET /javascripts/event-login.js 200 4ms - 1.29kb +GET /javascripts/event-assets.js 200 1ms - 2.1kb +GET /javascripts/modal.js 200 1ms - 1.21kb +GET /assets/5 200 2ms - 2 +keys { '@context': 'https://w3id.org/payswarm/v1', + publicKey: + { id: 'https://dev.payswarm.com/i/authority/keys/1', + privateKeyPem: '-----BEGIN RSA PRIVATE KEY-----\nMIIEowIBAAKCAQEAtwAuVHB6gddoZUT4WdGqXAdr2YnnKIzxyYxPQubeQ2+y7ZLG\njov9xYVhM/avm4NTRPili1NK5tyo8MQSAXbWNQMu7vYMuc5+CCpFpm1LrnQ4sWsR\nvaWSWNkFBZ8FGvcW7Yte/mefT+du1JBeB/eoafaK5qBQNj7qmNytvyDzOtxEtHUj\nJt9xfS2Jbox9j3MLHifEUMeoD5YErNjqOlVH98OT8x0cUCmbO6ujwD0Hd2RPh1If\nb+Q6Fp6XbLdu/36RL9SCSgRssCyVyvbcyTBemNHeRu/9J/G14qXW/SpyxnP7zmGP\nNX7ksnxG7gBj15zD03kzxrbaU5LObgI3bdDFXwIDAQABAoIBAC5/cUYrPjV3kiMJ\nH0FTMMIpcJHZpE59YYIgkJMjLh5cZ05OGP1nPJfPiB838u7Es4e21flMtJ9sOdDT\nQO/2Tf8yS96Tzi/387YHZ6Md6jjtduo9lkhlpYXFvqzq9tUfK0g4PW7OzX/0Agko\nlXvYxYYHCswGt9rQqbMlf1AtAyBVIXFklGTRFhfoveJ6smJABIabEgBIcz4jZxxd\nclSYjD2rEkPG60zWvfrjWhmN+NHINi/TrhruX40L74vJOjKAGtbQt+DHZ/8fDXe3\nNFVMFGIKyP1mw072g+797mfe1dJ7okk2Qgu/ea6FfiikDajdo3zpcO13Gyg4Pg2O\nbawGy4ECgYEA2ayQMTXqkA+fhlLmCMsAy0JUX1A6adkKJrRbP5EKUJKOIFxM7Bv1\n/FchyeTaL0XayWQ7rVN+8oBbo0FMpN23Hciw9wduNf+N7/QmGAy3JBl84EpXkbJb\nxxjax7f7VZPmeiR12d67fZ5i1mKeu4pssmbYN05Uv5htIq3DV2i4Vg8CgYEA1zjA\nRGIk/FjZYFhWAjB0W+vSCEdqsMxd6WmCLP9XIR2j5V71WE1ChTmAvBRzmI0GS8dP\nTFA6UY7UId0vS1XUSE/mn5d1q9vdXN1S0+rlL7QLlUJlH20SSnPrMxf3f1JiYyZQ\nobEDZWMxiOzBD5j1lOvIzl3RNvea573XBfxLa7ECgYEAjFNTrXXNnkuEEqsUgqyj\n+WTsUXm9/oido6/3dzZAiQrBtxjpufiYjrF5Jddz1K/ayKPmWOmP2DNpYAhzqYEJ\nUJkVhFr08LirvvoNKMnhstL/jvQ+Gb36rpJWUBRKYbP0C9+/XdHZ2rSlkQGIxOwL\nAMOONbE4rz9Lc+TDHnFzDH8CgYBtKnILvaR5AzAveF8X+S/sOC9u15q8Vs0Dyeqn\nnFS7jWdGvuW/hmDJZqNvwwfnRxD8evo0ATWzjLj4/FIy6jQlAbI/HPoo0/ryUajj\nqO/bRH3jlavpRs/SR/3zCqMVR9pz5Eld2oWYdbn4c+5xVOqsQPS4CEpIkUtXZKme\ndZxj4QKBgC6kn+elzr/if37W+eZbTyo7WhrRJqGttAs72isE5mL9ewijqFNjXC2y\nJHTKaBpBKv3RfOMCTCx/w5F+ONIY3VkePWEnEbcAI2Iy72DKP3imU8O0Sr5bVkDC\nPkvLiFTrq+kK7I6xuJfbYO/SIRIfN7PQsaAaymX10YQnuUYatTea\n-----END RSA PRIVATE KEY-----\n', + publicKeyPem: '-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAtwAuVHB6gddoZUT4WdGq\nXAdr2YnnKIzxyYxPQubeQ2+y7ZLGjov9xYVhM/avm4NTRPili1NK5tyo8MQSAXbW\nNQMu7vYMuc5+CCpFpm1LrnQ4sWsRvaWSWNkFBZ8FGvcW7Yte/mefT+du1JBeB/eo\nafaK5qBQNj7qmNytvyDzOtxEtHUjJt9xfS2Jbox9j3MLHifEUMeoD5YErNjqOlVH\n98OT8x0cUCmbO6ujwD0Hd2RPh1Ifb+Q6Fp6XbLdu/36RL9SCSgRssCyVyvbcyTBe\nmNHeRu/9J/G14qXW/SpyxnP7zmGPNX7ksnxG7gBj15zD03kzxrbaU5LObgI3bdDF\nXwIDAQAB\n-----END PUBLIC KEY-----\n' } } +auth doc { _id: 51e96cc8a0e24c65b0000001, + owner: 'https://dev.payswarm.com/i/piatra', + username: 'piatra' } +body { audience: 'http://localhost:3000', + expires: 1374255511620, + issuer: 'login.persona.org', + email: 'andrei.br92@gmail.com', + status: 'okay', + registered: 'true', + publicKey: '-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAtwAuVHB6gddoZUT4WdGq\nXAdr2YnnKIzxyYxPQubeQ2+y7ZLGjov9xYVhM/avm4NTRPili1NK5tyo8MQSAXbW\nNQMu7vYMuc5+CCpFpm1LrnQ4sWsRvaWSWNkFBZ8FGvcW7Yte/mefT+du1JBeB/eo\nafaK5qBQNj7qmNytvyDzOtxEtHUjJt9xfS2Jbox9j3MLHifEUMeoD5YErNjqOlVH\n98OT8x0cUCmbO6ujwD0Hd2RPh1Ifb+Q6Fp6XbLdu/36RL9SCSgRssCyVyvbcyTBe\nmNHeRu/9J/G14qXW/SpyxnP7zmGPNX7ksnxG7gBj15zD03kzxrbaU5LObgI3bdDF\nXwIDAQAB\n-----END PUBLIC KEY-----\n' } +doc { _id: 51e96cc8a0e24c65b0000001, + owner: 'https://dev.payswarm.com/i/piatra', + username: 'piatra' } +POST /auth/verify 200 4389ms - 661 +serving index +GET / 200 69ms - 1.96kb +GET /stylesheets/topcoat-mobile-light.css 304 4ms +GET /stylesheets/style.css 304 7ms +GET /javascripts/libs/require.js 304 4ms +GET /javascripts/main.js 304 1ms +keys { '@context': 'https://w3id.org/payswarm/v1', + publicKey: + { id: 'https://dev.payswarm.com/i/authority/keys/1', + privateKeyPem: '-----BEGIN RSA PRIVATE KEY-----\nMIIEowIBAAKCAQEAtwAuVHB6gddoZUT4WdGqXAdr2YnnKIzxyYxPQubeQ2+y7ZLG\njov9xYVhM/avm4NTRPili1NK5tyo8MQSAXbWNQMu7vYMuc5+CCpFpm1LrnQ4sWsR\nvaWSWNkFBZ8FGvcW7Yte/mefT+du1JBeB/eoafaK5qBQNj7qmNytvyDzOtxEtHUj\nJt9xfS2Jbox9j3MLHifEUMeoD5YErNjqOlVH98OT8x0cUCmbO6ujwD0Hd2RPh1If\nb+Q6Fp6XbLdu/36RL9SCSgRssCyVyvbcyTBemNHeRu/9J/G14qXW/SpyxnP7zmGP\nNX7ksnxG7gBj15zD03kzxrbaU5LObgI3bdDFXwIDAQABAoIBAC5/cUYrPjV3kiMJ\nH0FTMMIpcJHZpE59YYIgkJMjLh5cZ05OGP1nPJfPiB838u7Es4e21flMtJ9sOdDT\nQO/2Tf8yS96Tzi/387YHZ6Md6jjtduo9lkhlpYXFvqzq9tUfK0g4PW7OzX/0Agko\nlXvYxYYHCswGt9rQqbMlf1AtAyBVIXFklGTRFhfoveJ6smJABIabEgBIcz4jZxxd\nclSYjD2rEkPG60zWvfrjWhmN+NHINi/TrhruX40L74vJOjKAGtbQt+DHZ/8fDXe3\nNFVMFGIKyP1mw072g+797mfe1dJ7okk2Qgu/ea6FfiikDajdo3zpcO13Gyg4Pg2O\nbawGy4ECgYEA2ayQMTXqkA+fhlLmCMsAy0JUX1A6adkKJrRbP5EKUJKOIFxM7Bv1\n/FchyeTaL0XayWQ7rVN+8oBbo0FMpN23Hciw9wduNf+N7/QmGAy3JBl84EpXkbJb\nxxjax7f7VZPmeiR12d67fZ5i1mKeu4pssmbYN05Uv5htIq3DV2i4Vg8CgYEA1zjA\nRGIk/FjZYFhWAjB0W+vSCEdqsMxd6WmCLP9XIR2j5V71WE1ChTmAvBRzmI0GS8dP\nTFA6UY7UId0vS1XUSE/mn5d1q9vdXN1S0+rlL7QLlUJlH20SSnPrMxf3f1JiYyZQ\nobEDZWMxiOzBD5j1lOvIzl3RNvea573XBfxLa7ECgYEAjFNTrXXNnkuEEqsUgqyj\n+WTsUXm9/oido6/3dzZAiQrBtxjpufiYjrF5Jddz1K/ayKPmWOmP2DNpYAhzqYEJ\nUJkVhFr08LirvvoNKMnhstL/jvQ+Gb36rpJWUBRKYbP0C9+/XdHZ2rSlkQGIxOwL\nAMOONbE4rz9Lc+TDHnFzDH8CgYBtKnILvaR5AzAveF8X+S/sOC9u15q8Vs0Dyeqn\nnFS7jWdGvuW/hmDJZqNvwwfnRxD8evo0ATWzjLj4/FIy6jQlAbI/HPoo0/ryUajj\nqO/bRH3jlavpRs/SR/3zCqMVR9pz5Eld2oWYdbn4c+5xVOqsQPS4CEpIkUtXZKme\ndZxj4QKBgC6kn+elzr/if37W+eZbTyo7WhrRJqGttAs72isE5mL9ewijqFNjXC2y\nJHTKaBpBKv3RfOMCTCx/w5F+ONIY3VkePWEnEbcAI2Iy72DKP3imU8O0Sr5bVkDC\nPkvLiFTrq+kK7I6xuJfbYO/SIRIfN7PQsaAaymX10YQnuUYatTea\n-----END RSA PRIVATE KEY-----\n', + publicKeyPem: '-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAtwAuVHB6gddoZUT4WdGq\nXAdr2YnnKIzxyYxPQubeQ2+y7ZLGjov9xYVhM/avm4NTRPili1NK5tyo8MQSAXbW\nNQMu7vYMuc5+CCpFpm1LrnQ4sWsRvaWSWNkFBZ8FGvcW7Yte/mefT+du1JBeB/eo\nafaK5qBQNj7qmNytvyDzOtxEtHUjJt9xfS2Jbox9j3MLHifEUMeoD5YErNjqOlVH\n98OT8x0cUCmbO6ujwD0Hd2RPh1Ifb+Q6Fp6XbLdu/36RL9SCSgRssCyVyvbcyTBe\nmNHeRu/9J/G14qXW/SpyxnP7zmGPNX7ksnxG7gBj15zD03kzxrbaU5LObgI3bdDF\nXwIDAQAB\n-----END PUBLIC KEY-----\n' } } +auth doc { _id: 51e96cc8a0e24c65b0000001, + owner: 'https://dev.payswarm.com/i/piatra', + username: 'piatra' } +body { audience: 'http://localhost:3000', + expires: 1374255516952, + issuer: 'login.persona.org', + email: 'andrei.br92@gmail.com', + status: 'okay', + registered: 'true', + publicKey: '-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAtwAuVHB6gddoZUT4WdGq\nXAdr2YnnKIzxyYxPQubeQ2+y7ZLGjov9xYVhM/avm4NTRPili1NK5tyo8MQSAXbW\nNQMu7vYMuc5+CCpFpm1LrnQ4sWsRvaWSWNkFBZ8FGvcW7Yte/mefT+du1JBeB/eo\nafaK5qBQNj7qmNytvyDzOtxEtHUjJt9xfS2Jbox9j3MLHifEUMeoD5YErNjqOlVH\n98OT8x0cUCmbO6ujwD0Hd2RPh1Ifb+Q6Fp6XbLdu/36RL9SCSgRssCyVyvbcyTBe\nmNHeRu/9J/G14qXW/SpyxnP7zmGPNX7ksnxG7gBj15zD03kzxrbaU5LObgI3bdDF\nXwIDAQAB\n-----END PUBLIC KEY-----\n' } +doc { _id: 51e96cc8a0e24c65b0000001, + owner: 'https://dev.payswarm.com/i/piatra', + username: 'piatra' } +POST /auth/verify 200 3520ms - 661 +GET /javascripts/app.js 304 1ms +GET /javascripts/event-handlers.js 304 1ms +GET /javascripts/event-login.js 304 2ms +GET /javascripts/message.js 304 1ms +GET /javascripts/event-assets.js 304 2ms +GET /javascripts/modal.js 304 0ms +GET /assets/5 200 6ms - 2 +GET /font/SourceSansPro-Regular.otf 404 5ms +GET /font/SourceSansPro-Semibold.otf 404 4ms +GET /font/SourceSansPro-Light.otf 404 3ms +GET /assets/created 200 2ms - 2 +GET /assets/created 200 9ms - 2 +new asset piatra +GET /newasset 200 113ms - 5.37kb +GET /stylesheets/topcoat-mobile-light.css 200 6ms - 25.94kb +GET /stylesheets/style.css 200 7ms - 4.21kb +GET /javascripts/libs/require.js 200 3ms - 14.65kb +GET /javascripts/main.js 200 19ms - 50 +GET /javascripts/app.js 200 1ms - 133 +GET /javascripts/event-handlers.js 200 1ms - 991 +GET /javascripts/event-assets.js 200 7ms - 2.1kb +GET /javascripts/event-login.js 200 7ms - 1.29kb +GET /javascripts/message.js 200 6ms - 773 +GET /javascripts/modal.js 200 1ms - 1.21kb +GET /assets/5 200 3ms - 2 +GET /font/SourceSansPro-Regular.otf 404 1ms +GET /font/SourceSansPro-Semibold.otf 404 1ms +GET /font/SourceSansPro-Light.otf 404 1ms +createListing +createAsset +POST /newasset/process/ 200 30ms - 2.86kb +{ '@context': 'https://w3id.org/payswarm/v1', + id: 'http://listings.dev.payswarm.com/mozhacks/html5-me-song#listing', + userId: '51e96cc8a0e24c65b0000001', + vendor: 'https://dev.payswarm.com/i/webpayments', + asset: 'http://listings.dev.payswarm.com/mozhacks/demo#asset', + assetHash: 'urn:sha256:a20f1c33367f5281e21bac61ea9a00e871b9b42761eabae00ff502f6507fc1c7', + license: 'https://w3id.org/payswarm/licenses/personal-use', + licenseHash: 'urn:sha256:a5917c762b776903d082b9f8390f6dd9e632b372f220a25713a0cdfa38729b94', + validFrom: Fri Jul 19 2013 03:00:00 GMT+0300 (EEST), + validUntil: Sat Jul 20 2013 03:00:00 GMT+0300 (EEST), + signature: + { signatureValue: 'SfvoKKV4jP2936c0g9hTPUKcjeIsVf/uMS5x3/KNZ9VULLc3emoaVxYMcSk7/v5pPDtBRaqCHc2ym5FZVsWDmfD4oIqmTf9yk/WcxwuAdhp+U32aX2ZR15oBQJ9h5UoI6Lc3xJ900jp6WggbQWw1knxSzbWOkCW337/wmNiVrURpxW+8wrdAES4+8yefnAEAXN3c4I5Hz3YPhzTWTWK/kD3ItYqOR+nJDTw4nLUBW6qIMRBhyLNV467h1eLlRtt0ZeONjXVsXf342ZP3Xpio/65qiNvWP3mZRWUDsTNX8QWxpVqkwr7cwpr52iCQXx2ccC+w/l0AbbicPg+E2rR+MQ==', + created: '2013-07-19T17:37:12Z', + creator: 'https://dev.payswarm.com/i/authority/keys/1', + type: 'GraphSignature2012' }, + _id: 51e9794ae404e772b6000001, + payeeRule: + [ { payeeApplyType: 'ApplyInclusively', + maximumPayeeRate: '5', + payeeRateType: 'Percentage', + payeeGroupPrefix: [Object], + type: 'PayeeRule' } ], + payee: + [ { comment: '123321', + payeeApplyType: 'ApplyExclusively', + currency: 'USD', + payeeRate: '2', + payeeRateType: 'FlatAmount', + payeeGroup: [Object], + destination: 'https://dev.payswarm.com/i/webpayments/accounts/primary', + type: 'Payee' } ], + type: [ 'Listing' ] } +{ '@context': 'https://w3id.org/payswarm/v1', + id: 'http://listings.dev.payswarm.com/mozhacks/demo#asset', + userId: '51e96cc8a0e24c65b0000001', + title: 'tren', + assetContent: 'http://listings.dev.payswarm.com/mozhacks/demo#asset', + assetProvider: 'https://dev.payswarm.com/i/piatra', + signature: + { signatureValue: 'fX3airvoC/+/huh5oxF3LGt3RWmEdIjT306d6PAuuWCXedZs9WmagIb0hWAlOlV85UIAja8ep3v19Mm483PJdQbZAD89JDp9YD7wisg3gk+pTZgQLekiZ+mcFfqhhRg1bJyesJyZkgYPQ9+gcZMhBvFjUyvvbW3fC1WrW4iqIDM3LNbDrHB1XBuSNrzTWNScNmNzStuIf9yqVAlbseOF6Yc4BQuhaGUR8MxSKmiah6feGMYfwdtEn7L2SS6YhzL8+2WEkgAjvVsN1XG8j+FieE04QbI17x/dglh+Ip61aU7ip0m5syewvO4cIc37T9o8hmTCI5GSnn3NmYGA0MA1oQ==', + created: '2013-07-19T17:37:12Z', + creator: 'https://dev.payswarm.com/i/authority/keys/1', + type: 'GraphSignature2012' }, + _id: 51e9794ae404e772b6000002, + creator: { fullName: 'Joe' }, + type: [ 'Asset' ] } +51e96cc8a0e24c65b0000001 +POST /newasset/save 500 9ms +GET /assets/created 200 2ms - 2 diff --git a/package.json b/package.json index c6ae45a..c8770f7 100644 --- a/package.json +++ b/package.json @@ -27,6 +27,10 @@ "engines": { "node": "0.8.x" }, + "repository" : { + "type" : "git", + "url" : "https://github.com/piatra/webpayments-marketplace" + }, "devDependencies": { "requirejs": "~2.1.6" } diff --git a/public/javascripts/event-assets.js b/public/javascripts/event-assets.js index 093c403..3b10297 100644 --- a/public/javascripts/event-assets.js +++ b/public/javascripts/event-assets.js @@ -42,7 +42,7 @@ define(['modal', 'message'], function (modal, message) { function setListAssets (docs) { docs.forEach(function (d) { - if (!d.listing) return; + if (!d.listing.payee[0]) return; var title = d.asset.title + '
' + d.listing.payee[0].comment + ''; $('
  • ').addClass('topcoat-list__item') .html(title).appendTo('.js-handler--asset-list'); diff --git a/public/javascripts/event-handlers.js b/public/javascripts/event-handlers.js index c7927ca..13fd6f8 100644 --- a/public/javascripts/event-handlers.js +++ b/public/javascripts/event-handlers.js @@ -17,12 +17,10 @@ define([ init : function () { var email = ($('img', $('.js-handler--login')).length) - ? null - : $('.js-handler--login').text().trim() + ? null + : $('.js-handler--login').text().trim() ; - console.log(email); - navigator.id.watch({ onlogin: function(assertion) { if ($('img', $('.js-handler--login')).length) diff --git a/public/javascripts/event-login.js b/public/javascripts/event-login.js index 8f20cb6..81630c7 100644 --- a/public/javascripts/event-login.js +++ b/public/javascripts/event-login.js @@ -35,7 +35,7 @@ define(['message', 'modal'], function (message, modal) { {tag: 'input', type:'submit', value: 'Register', 'class' : 'button--main'} ], form: '/payswarm/complete' - }) + }).appendTo('body'); }); } } diff --git a/public/javascripts/test.txt b/public/javascripts/test.txt new file mode 100644 index 0000000..b9c43b4 --- /dev/null +++ b/public/javascripts/test.txt @@ -0,0 +1,49 @@ +{ + "assetId": "51e5bbb32accfe6525000002", + "@context": "https://w3id.org/payswarm/v1", + "id": "http://listings.dev.payswarm.com/mozhacks/html5-me-song#listing", + "userId": "51cb00e7b544338396000001", + "vendor": "https://dev.payswarm.com/i/the-webdevs", + "asset": "http://listings.dev.payswarm.com/mozhacks/demo#asset", + "assetHash": "urn:sha256:04a349226b8aa3342d1f793572e3a3049c539144d1762547862f92b44c084af9", + "license": "https://w3id.org/payswarm/licenses/personal-use", + "licenseHash": "urn:sha256:73ebeac3656bf37419a02a9d5041226dcc42722d5256895d324519a7b6d7d690", + "validFrom": "2013-07-16T00:00:00.000Z", + "validUntil": "2013-07-21T00:00:00.000Z", + "signature": { + "type": "GraphSignature2012", + "creator": "https://dev.payswarm.com/i/authority/keys/1", + "created": "2013-07-16T21:31:29Z", + "signatureValue": "kv/uWVEhEbzig5LmBxAWqvShDM6GOiCL/8pXVG58N34VPmv6TPO8sHU1CEyg2PtL7UGdrRzJlj3gsWC7puyRPMt6SptU6VvFkXO8nP0unDFGUKOn1RfAzxgrMG9oxas/o/K+r6selfpKTygfYmdF+4aNDjh78bn3WwhJO4Wees+jH/5PDEY88dDdSw+c/ECkg4FPiMGQMzyG4TZwIu+AO2tNKSbicm44DJRbLYij+VeITbCJ/1R+LZlrJukKLqFTA/Km+3l7Tay100/xXvyCCzNCYf/LHwDCeBL7oiey9dx4YZYrtt/wQLUvNHI8jEIabjwCydz5I5DYKIOfwAVqXA==" + }, + "_id": "51e5bbb32accfe6525000001", + "__v": 0, + "payeeRule": [ + { + "type": "PayeeRule", + "payeeGroupPrefix": [ + "authority" + ], + "payeeRateType": "Percentage", + "maximumPayeeRate": "5", + "payeeApplyType": "ApplyInclusively" + } + ], + "payee": [ + { + "type": "Payee", + "destination": "https://dev.payswarm.com/i/the-webdevs/accounts/royalties", + "payeeGroup": [ + "vendor" + ], + "payeeRateType": "FlatAmount", + "payeeRate": "2", + "currency": "USD United States Dollars", + "payeeApplyType": "ApplyExclusively", + "comment": "this is a comment" + } + ], + "type": [ + "Listing" + ] +} \ No newline at end of file diff --git a/public/stylesheets/style.css b/public/stylesheets/style.css index 65acc9e..d61ac52 100644 --- a/public/stylesheets/style.css +++ b/public/stylesheets/style.css @@ -17,7 +17,7 @@ a { text-decoration: none; } .container { - width: 90%; + width: 80%; margin: 0 auto; } .item-container { @@ -31,17 +31,16 @@ a { padding: 0; } .item-container li { + background: #fff; + margin: 0 1rem 0 0; padding: 1rem; height: 150px; - width: 20%; + max-width: 20%; list-style: none; -webkit-flex: auto; flex: 1 1 auto; -webkit-transition-duration: 0.3s; - border-bottom: 4px solid #dfe2e2; -} -.item-container li:hover { - border-bottom: 4px solid #fff; + border-bottom: 2px solid rgba(0,0,0,0.2); } .item-container li .topcoat-button--cta { display: none; @@ -53,7 +52,6 @@ a { background: #fff; padding: 1rem; margin: 0; - border-radius: 10px; } .messages { position: absolute; @@ -172,6 +170,20 @@ table td { .warning { background: #ffffbf; } +.full-width { + width: 100%; +} +.margin-top { + margin-top: 1rem; +} +.description { + background: #fff; + padding: 1rem; + border-bottom: 1px solid rgba(0,0,0,0.2); + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} .docNav { font-size: 1rem; height: 3rem; diff --git a/public/stylesheets/style.styl b/public/stylesheets/style.styl index 04a9fe6..507376e 100644 --- a/public/stylesheets/style.styl +++ b/public/stylesheets/style.styl @@ -19,7 +19,7 @@ a text-decoration none .container - width 90% + width 80% margin 0 auto .item-container @@ -32,16 +32,16 @@ a flex-wrap: wrap; padding 0 li + background #fff + margin 0 1rem 0 0 padding 1rem height 150px - width 20% + max-width 20% list-style none -webkit-flex: auto flex: 1 1 auto; -webkit-transition-duration .3s - border-bottom 4px solid #dfe2e2 - &:hover - border-bottom 4px solid #fff + border-bottom 2px solid rgba(0,0,0,.2) .item-container li @@ -56,7 +56,6 @@ a background #fff padding 1rem margin 0 - border-radius 10px .messages position absolute @@ -170,6 +169,20 @@ table th, table td .warning background warningBg +.full-width + width 100% + +.margin-top + margin-top 1rem + +.description + background white + padding 1rem + border-bottom 1px solid rgba(0,0,0,.2) + -webkit-box-sizing border-box + -moz-box-sizing border-box + box-sizing border-box + .docNav font-size 1rem height 3rem diff --git a/public/stylesheets/topcoat-mobile-light.css b/public/stylesheets/topcoat-mobile-light.css index 8ec722e..5c3fdd8 100644 --- a/public/stylesheets/topcoat-mobile-light.css +++ b/public/stylesheets/topcoat-mobile-light.css @@ -687,7 +687,7 @@ Navigation Bar background: transparent; border: none; cursor: default; - height: 2.6rem; + height: 5rem; padding-left: 1rem; padding-right: 1rem; background: #e5e9e8; @@ -712,7 +712,7 @@ Navigation Bar background: transparent; border: none; margin: var-margin; - line-height: 2.6rem; + line-height: 5rem; vertical-align: top; } .topcoat-navigation-bar__title { @@ -936,11 +936,11 @@ limitations under the License. -webkit-box-sizing: border-box; -moz-box-sizing: border-box; box-sizing: border-box; - padding: 0 1.25rem; + padding: 0 1rem; -webkit-border-radius: 6px; border-radius: 6px; margin: 5px; - height: 3rem; + height: 2rem; font: inherit; font-weight: 200; outline: none; @@ -1043,7 +1043,7 @@ Topcoat Large Textarea */ .topcoat-textarea--large { - font: var-font--large; + font-size: 1.3rem; font-weight: 200; line-height: 2.6rem; } \ No newline at end of file diff --git a/routes/assets.js b/routes/assets.js index 54193d0..37029a9 100644 --- a/routes/assets.js +++ b/routes/assets.js @@ -1,4 +1,8 @@ var asset = require('../lib/asset')(); +var keys = require('../lib/keys')(); +var payswarm = require('payswarm'); +var fs = require('fs'); +var host = 'webpayments.fwd.wf'; var assets = { processAsset : function (req, res) { @@ -40,19 +44,109 @@ var assets = { }); }, + purchase: function (req, res) { + // this is a big FIXME + if (!req.session.identity) res.end('not logged in '); + else { + asset.getOneListing({'assetId' : req.params.id}, function (listing) { + keys.getKeyPair(function (err, keys) { + if (err) { + console.log('error reading keys while making purchase'); + res.end('error'); + } else { + keys = JSON.parse(keys); + listing = listing[0]; + listing["@context"] = "https://w3id.org/payswarm/v1"; + fs.readFile(__dirname + '/../lib/listing.simple.cfg', 'utf8', function (err, data) { + json = JSON.parse(data); + var listing2 = {}; + for (var i in json) { + listing2[i] = listing[i]; + } + //FIXME + listing2.asset = 'http://'+host+'/assets/asset/' + listing.assetId; + listing2.id = 'http://'+host+'/listings/listing/' + listing['_id']; + payswarm.purchase(listing2, { + transactionService: 'https://dev.payswarm.com/transactions', + customer: req.session.identity, + source: req.session.identity, + privateKeyPem: keys.publicKey.privateKeyPem, + publicKey: keys.publicKey.id, + verbose: true + }, function(err, receipt) { + if (err) { + console.log(JSON.stringify(err, null,2)); + res.json([listing2,keys.publicKey.privateKeyPem,keys.publicKey.id,req.session.identity]); + } else { + console.log('Receipt:', receipt); + console.log('Transaction ID:', receipt.contract.id); + } + }); + }) + } + }) + + }); + + } + + }, + + getListing: function (req, res) { + var query = {'_id': req.params.id}; + asset.getListing(query, function (doc) { + res.json(doc); + }); + }, + + getAsset: function (req, res) { + var query = {'_id': req.params.id}; + asset.getAsset(query, function (doc) { + res.json(doc); + }); + }, + + decrypt: function (req, res) { + var type = req.params.type, + query = {'_id': req.params.id} + ; + if (type == 'asset') { + asset.getAsset(query, function (doc) { + keys.getKeyPair(function (err, keys) { + var json = JSON.parse(keys); + payswarm.decrypt(doc, {privateKey: json.publicKey.privateKeyPem}, function (err, resp){ + res.json({ + err: err, + res: resp + }) + }); + }); + }); + } + if (type == 'listing') { + asset.getListing(query, function (doc) { + keys.getKeyPair(function (err, keys) { + var json = JSON.parse(keys); + payswarm.decrypt(doc, {privateKey: json.publicKey.privateKeyPem}, function (err, resp){ + res.json({ + err: err, + res: resp + }) + }); + }) + }); + } + }, + getUserAssets: function (req, res) { var query = { email: req.session.email }; - console.log('query', query, 'getUserAssets'); asset.getUserAssets(query, function (assets) { - console.log('got assets', assets); res.json(assets); }); }, getLatestAssets: function (req, res) { - console.log('limit', req.params.count); asset.getUserAssets({}, function (assets) { - console.log('getlatestassets', assets); res.json(assets); }); } diff --git a/routes/auth.js b/routes/auth.js index 092ca08..e5e8c2c 100644 --- a/routes/auth.js +++ b/routes/auth.js @@ -36,7 +36,10 @@ var auth = { body = JSON.parse(body); if (body.status == 'okay') { user.checkUser(body, function (user) { - body.registered = user.registered; + + if (!user) body.registered = false; + else body.registered = user.registered; + keys.getKeyPair(function (err, keyPair) { if (err) { console.log(err); @@ -60,9 +63,22 @@ var auth = { returnKeys: function (req, res, body, keyPair) { keyPair = JSON.parse(keyPair); + console.log('keys', keyPair); body.publicKey = keyPair.publicKey.publicKeyPem; req.session.email = body.email; - res.json(body); + user.get({owner: 1, username: 1}, {email: body.email}, function (err, doc) { + if (err) { + console.log(err); + } else { + console.log('auth doc', doc); + req.session.userid = doc['_id']; + req.session.identity = doc.owner; + req.session.username = doc.username; + console.log('body', body); + console.log('doc', doc); + res.json(body); + } + }) }, registerKey : function (req, res) { @@ -75,6 +91,7 @@ var auth = { registrationUrl.query['response-nonce'] = new Date().getTime().toString(16); delete registrationUrl.search; registrationUrl = URL.format(registrationUrl); + console.log('registrationUrl', registrationUrl); callback(null, registrationUrl) }, function(registrationUrl, callback) { diff --git a/routes/index.js b/routes/index.js index 167a055..8885a45 100644 --- a/routes/index.js +++ b/routes/index.js @@ -3,13 +3,22 @@ * Main pages */ -var title = 'WebPayments Marketplace' +var title = 'WebPayments Marketplace'; +var assets = require('../lib/asset.js')(); exports.index = function(req, res) { - res.render('index', { - title: title, - user : (req.session.email) ? req.session.email : false + console.log('serving index'); + assets.getUserAssets({}, function (assets) { + + res.render('index', { + title: title, + user: (req.session.email) ? req.session.email : null, + id: (req.session.userid) ? req.session.userid : null, + identity: (req.session.identity) ? req.session.identity: null, + assets: assets.slice(0,4) + }); }); + }; exports.login = function (req, res) { @@ -19,8 +28,12 @@ exports.login = function (req, res) { } exports.newasset = function(req, res) { + console.log('new asset', req.session.username); res.render('newasset', { - title: title + ' - register asset', - user : (req.session.email) ? req.session.email : false + title: 'Create an asset', + user : (req.session.email) ? req.session.email : null, + identity: (req.session.identity) ? req.session.identity: null, + id : (req.session.userid) ? req.session.userid : null, + username: (req.session.username) ? req.session.username : null }); }; \ No newline at end of file diff --git a/routes/user.js b/routes/user.js new file mode 100644 index 0000000..a4a1ee5 --- /dev/null +++ b/routes/user.js @@ -0,0 +1,19 @@ +var user = require('../lib/user')(); + +module.exports = { + setUsername: function (req, res) { + console.log(user); + user.updateFields({ + username: req.body.username + }, + { + email: req.body.email + }, function (err) { + if (err) { + console.log('error while updateing user',err); + } else { + res.end('Profile username updated!'); + } + }); + } +}; \ No newline at end of file diff --git a/test.js b/test.js new file mode 100644 index 0000000..8cad606 --- /dev/null +++ b/test.js @@ -0,0 +1,33 @@ +var fs = require('fs'); +console.log('reading'); +fs.readFile('./test.txt', 'utf8', function (err, data) { + console.log(err); + json = JSON.parse(data); + console.log(json); + _clone(json); +}); + +function _clone(value) { + if(value && typeof value === 'object') { + var rval; + console.log('going to test ', value); + if(_isArray(value)) { + rval = []; + for(var i = 0; i < value.length; ++i) { + rval[i] = _clone(value[i]); + } + } + else { + rval = {}; + for(var key in value) { + rval[key] = _clone(value[key]); + } + } + return rval; + } + return value; +} + +function _isArray(v) { + return Array.isArray(v); +} \ No newline at end of file diff --git a/test.txt b/test.txt new file mode 100644 index 0000000..b9c43b4 --- /dev/null +++ b/test.txt @@ -0,0 +1,49 @@ +{ + "assetId": "51e5bbb32accfe6525000002", + "@context": "https://w3id.org/payswarm/v1", + "id": "http://listings.dev.payswarm.com/mozhacks/html5-me-song#listing", + "userId": "51cb00e7b544338396000001", + "vendor": "https://dev.payswarm.com/i/the-webdevs", + "asset": "http://listings.dev.payswarm.com/mozhacks/demo#asset", + "assetHash": "urn:sha256:04a349226b8aa3342d1f793572e3a3049c539144d1762547862f92b44c084af9", + "license": "https://w3id.org/payswarm/licenses/personal-use", + "licenseHash": "urn:sha256:73ebeac3656bf37419a02a9d5041226dcc42722d5256895d324519a7b6d7d690", + "validFrom": "2013-07-16T00:00:00.000Z", + "validUntil": "2013-07-21T00:00:00.000Z", + "signature": { + "type": "GraphSignature2012", + "creator": "https://dev.payswarm.com/i/authority/keys/1", + "created": "2013-07-16T21:31:29Z", + "signatureValue": "kv/uWVEhEbzig5LmBxAWqvShDM6GOiCL/8pXVG58N34VPmv6TPO8sHU1CEyg2PtL7UGdrRzJlj3gsWC7puyRPMt6SptU6VvFkXO8nP0unDFGUKOn1RfAzxgrMG9oxas/o/K+r6selfpKTygfYmdF+4aNDjh78bn3WwhJO4Wees+jH/5PDEY88dDdSw+c/ECkg4FPiMGQMzyG4TZwIu+AO2tNKSbicm44DJRbLYij+VeITbCJ/1R+LZlrJukKLqFTA/Km+3l7Tay100/xXvyCCzNCYf/LHwDCeBL7oiey9dx4YZYrtt/wQLUvNHI8jEIabjwCydz5I5DYKIOfwAVqXA==" + }, + "_id": "51e5bbb32accfe6525000001", + "__v": 0, + "payeeRule": [ + { + "type": "PayeeRule", + "payeeGroupPrefix": [ + "authority" + ], + "payeeRateType": "Percentage", + "maximumPayeeRate": "5", + "payeeApplyType": "ApplyInclusively" + } + ], + "payee": [ + { + "type": "Payee", + "destination": "https://dev.payswarm.com/i/the-webdevs/accounts/royalties", + "payeeGroup": [ + "vendor" + ], + "payeeRateType": "FlatAmount", + "payeeRate": "2", + "currency": "USD United States Dollars", + "payeeApplyType": "ApplyExclusively", + "comment": "this is a comment" + } + ], + "type": [ + "Listing" + ] +} \ No newline at end of file diff --git a/views/index.jade b/views/index.jade index 07f269b..ba780d0 100644 --- a/views/index.jade +++ b/views/index.jade @@ -1,33 +1,22 @@ extends layout block content + .description + .container + h4 Welcome to the WebPayments Marketplace + p: small: em This application is implemented using: Mozilla Persona, Payswarm.js + - if (!user) + p You should sign up for an account and give it a try .container - h1 Welcome to the WebPayments Marketplace - p - | This application is implemented using - ul - li Mozilla Persona - li WebPayments - li PaySwarm - p You should sign up for an account and give it a try + br .category h4.category__title | Newest - button.topcoat-button.pull-right See all + a.topcoat-button.pull-right(href='/assets/all') See all ul.item-container.container--newest - li - h4 Item name - p Item description - button.topcoat-button--cta Buy - li - h4 Item name - p Item description - button.topcoat-button--cta Buy - li - h4 Item name - p Item description - button.topcoat-button--cta Buy - li - h4 Item name - p Item description - button.topcoat-button--cta Buy \ No newline at end of file + - assets.forEach(function (asset) { + li + h4= asset.asset.title + p comment + a.topcoat-button--cta(href='/assets/' + asset.asset['_id'] + '/purchase') Buy + - }) \ No newline at end of file diff --git a/views/layout.jade b/views/layout.jade index 8fae9fc..c991644 100644 --- a/views/layout.jade +++ b/views/layout.jade @@ -8,15 +8,16 @@ html .topcoat-navigation-bar .container .topcoat-navigation-bar__item.left.quarter - a(class='topcoat-icon-button', href='/') Home - a(class='topcoat-icon-button', href='/newasset') Sell - a(class='topcoat-icon-button', href='/about') About + a(class='topcoat-icon-button--quiet', href='/') Home + a(class='topcoat-icon-button--quiet', href='/newasset') Sell + a(class='topcoat-icon-button--quiet', href='/about') About + input(type='search', placeholder='search') .topcoat-navigation-bar__item.center.half - h1.topcoat-navigation-bar__title WebPayments Marketplace + h1.topcoat-navigation-bar__title= title || 'WebPayments Marketplace' .topcoat-navigation-bar__item.right a.topcoat-icon-button--quiet - if (user) - a.right(class='topcoat-icon-button js-handler--login', href='#')= user + button.right(class='topcoat-icon-button', data-id=id)= user .topcoat-notification .topcoat-list__container.list--medium ul.topcoat-list.js-handler--asset-list diff --git a/views/newasset.jade b/views/newasset.jade index 2725d24..d84a213 100644 --- a/views/newasset.jade +++ b/views/newasset.jade @@ -1,52 +1,72 @@ extends layout block content + .description + .container + - if (!username) + h4 Choose a username + p: small: em This is used to show who is selling the asset without showing your real email address. + - else + h4 Complete the asset description + p: small: em You need to complete all of the fields below to create the asset and listing .container - h1 Create a new asset - p make an asset and listing for a new good to sell - form.half.pull-left.js-handler--create-asset(action='/newasset/process/', method='POST') - table.table-form - tr - td: input(type='hidden', value=user, name='email') - tr - td: label Title - td: input(class='topcoat-text-input', type='text', name='title', placeholder='Asset title', value='HTML5', required) - tr - td: label Author - td: input(class='topcoat-text-input', type='text', name='author', placeholder='Asset creator', value='Joe', required) - tr - td: label Link to content - td: input(class='topcoat-text-input', type='file', name='assetContent',required) - tr - td: label Price - td - input.topcoat-text-input(type='number', step=0.01, name='payeeRate', value=2) - select.docNav(name='currency') - - tr - td Comments - td: textarea(class='topcoat-textarea', placeholder='Comments', name='comment') - tr - td: label Validity - td - - var today = new Date().toISOString().slice(0,10); - input(type='date', class='topcoat-text-input', name='validFrom', value=today, required) - input(type='date', class='topcoat-text-input', name='validUntil', required) - tr - td: label License - td - select.docNav(name='license') - option(selected='selected', value='https://w3id.org/payswarm/licenses/personal-use') Personal use - p - button(type='submit', class='topcoat-button--large--cta pull-right') Create asset - .half.pull-right - h2 About assets and listings - p An asset is a description of a product or service. Examples of assets include web pages, ebooks, groceries, concert tickets, dog walking services, donations, rights to transmit on a particular radio frequency band, and invoices for work performed. In general, anything of value can be modeled as an asset. - p A listing is a description of the specific terms under which an asset is offered for sale. These terms include: the exact asset being sold, the license that will be associated with the purchase, the list of people or organizations to be paid for the asset, and the validity period for the listing. Like an asset, a listing may include other application-specific properties. - p Source - a(href='https://hacks.mozilla.org/2013/04/payswarm-part-2/') Web Payments with PaySwarm: Assets and Listings (part 2 of 3) + - if (!username) + form.half.pull-left(action='/user/set/username', method='POST') + table.table-form + tr + td: label Username + td: input.topcoat-text-input(type='text', name='username', required) + tr + td: input(type='hidden', name='email', value=user) + td: button(type='submit', class='topcoat-button--large--cta') Create asset + - else + form.half.pull-left.js-handler--create-asset(action='/newasset/process/', method='POST') + table.table-form + tr + td: input(type='hidden', value=user, name='email') + tr + td: label Title + td: input(class='topcoat-text-input', type='text', name='title', placeholder='Asset title', value='HTML5', required) + tr + td: label Author + td: input(class='topcoat-text-input', type='text', name='author', placeholder='Asset creator', value='Joe', required) + tr + td Description + td: textarea(class='topcoat-textarea full-width', placeholder='Comments', name='description') + tr + td: label Link to content + td: input(class='topcoat-text-input', type='file', name='assetContent',required) + tr + td: label Price + td + input.topcoat-text-input(type='number', step=0.01, name='payeeRate', value=2) + select.docNav(name='currency') + + tr + td Comments + td: textarea(class='topcoat-textarea', placeholder='Comments', name='comment') + tr + td: label Validity + td + - var today = new Date().toISOString().slice(0,10); + input(type='date', class='topcoat-text-input', name='validFrom', value=today, required) + input(type='date', class='topcoat-text-input', name='validUntil', required) + tr + td: label License + td + select.docNav(name='license') + option(selected='selected', value='https://w3id.org/payswarm/licenses/personal-use') Personal use + p + input(type='hidden', name='userId', value=id) + button(type='submit', class='topcoat-button--large--cta pull-right') Create asset + .half.pull-right.description.margin-top + h2 About assets and listings + p An asset is a description of a product or service. Examples of assets include web pages, ebooks, groceries, concert tickets, dog walking services, donations, rights to transmit on a particular radio frequency band, and invoices for work performed. In general, anything of value can be modeled as an asset. + p A listing is a description of the specific terms under which an asset is offered for sale. These terms include: the exact asset being sold, the license that will be associated with the purchase, the list of people or organizations to be paid for the asset, and the validity period for the listing. Like an asset, a listing may include other application-specific properties. + p Source + a(href='https://hacks.mozilla.org/2013/04/payswarm-part-2/') Web Payments with PaySwarm: Assets and Listings (part 2 of 3) From db3102cb37b9fba1fe897cba21e0582247e44b3c Mon Sep 17 00:00:00 2001 From: piatra Date: Wed, 24 Jul 2013 14:18:13 +0300 Subject: [PATCH 2/4] signing hash fixed --- app.js | 4 +- lib/asset.js | 11 +- lib/db.js | 28 +--- lib/payswarm.cfg | 14 +- lib/schemas.js | 37 +++-- output | 333 +++++++++++++++----------------------- routes/assets.js | 270 ++++++++++++++++++++++++++----- routes/assets/1400bca6fe7 | 114 +++++++++++++ routes/assets/1400bdcfa36 | 114 +++++++++++++ routes/auth.js | 3 - routes/index.js | 3 +- views/index.jade | 2 +- views/newasset.jade | 3 +- 13 files changed, 640 insertions(+), 296 deletions(-) create mode 100644 routes/assets/1400bca6fe7 create mode 100644 routes/assets/1400bdcfa36 diff --git a/app.js b/app.js index 004a316..233be47 100644 --- a/app.js +++ b/app.js @@ -43,12 +43,14 @@ app.post('/payswarm/register', auth.registerKey); app.post('/payswarm/complete', auth.complatePayswarmRegistration); app.get('/newasset', routes.newasset); -app.post('/newasset/process/', assets.processAsset); +app.post('/newasset/process/', assets.createAssetAndListing); app.post('/newasset/save', assets.saveAsset); app.get('/assets/created', assets.getUserAssets); app.get('/assets/:count', assets.getLatestAssets); +app.get('/resign/listing/:id', assets.resignListing); + app.get('/assets/asset/:id', assets.getAsset); app.get('/listings/listing/:id', assets.getListing); diff --git a/lib/asset.js b/lib/asset.js index 1f466d2..f4636f9 100644 --- a/lib/asset.js +++ b/lib/asset.js @@ -25,9 +25,6 @@ module.exports = function (options) { cb(err); } else { // set the asset to the listing - signedListing.asset = signedAsset.id; - signedListing.assetHash = assetHash; - signedListing.licenseHash = listingHash; var assetAndListing = { "@context": 'https://w3id.org/payswarm/v1', "@graph": [signedAsset, signedListing] @@ -179,9 +176,10 @@ module.exports = function (options) { } else { var docs = []; var l = assets.length; + console.log('found' + l + 'assets for query',query); if(!l) cb(docs); assets.forEach(function (asset) { - db.get.userListings(asset['_id'], function (err, doc) { + db.get.listing({'assetId':asset.listingId}, function (err, doc) { if (err) { console.log(err); cb({'error':err}); @@ -208,9 +206,6 @@ module.exports = function (options) { console.log(err); cb(errMsg); } else { - // FIXME - doc[0].asset = 'http://'+host+'/assets/asset/' + doc[0]['assetId']; - doc[0].id = 'http://'+host+'/listings/listing/' + doc[0]['_id']; cb(doc[0] || errMsg); } }); @@ -223,8 +218,6 @@ module.exports = function (options) { console.log(err); cb(errMsg); } else { - doc[0].assetContent = 'http://'+host+'/asset/content/' + doc[0]['_id']; - doc[0].id = 'http://'+host+'/assets/asset/' + doc[0]['_id']; cb(doc[0] || errMsg); } }); diff --git a/lib/db.js b/lib/db.js index 037dcd1..9751a37 100644 --- a/lib/db.js +++ b/lib/db.js @@ -35,23 +35,20 @@ var dbUtils = { } }, save : { - asset: function (graph, cb) { - var listing = new schemas.Listing(graph.listing); - var asset = new schemas.Asset(graph.asset); + asset: function (assetAndListing, cb) { - asset.userId = listing.userId; - asset.listingId = listing._id; - listing.assetId = asset._id; + console.log(arguments); - assert(asset.userId, 'listing', asset); - assert(listing.userId, 'user id', listing); - assert(listing._id, 'listing id', listing); + var asset = new schemas.Asset(assetAndListing['@graph'][0]); + var listing = new schemas.Listing(assetAndListing['@graph'][1]); asset.save(function (err) { + console.log('asset err', err); if (err) { cb(err); } else { listing.save(function (err) { + console.log('listing err', err); if (err) { cb(err); } else { @@ -93,18 +90,7 @@ var dbUtils = { schemas.Listing.find(query, dbUtils.next(cb)); }, userAssets: function (query, cb) { - dbUtils.get.user({ - owner: 1 - }, query, function (err, doc) { - if (err) { - console.log(err); - cb(err); - } else { - schemas.Asset.find({ - assetProvider: (doc) ? doc.owner : [] - }, dbUtils.next(cb)); - } - }) + schemas.Asset.find(query, dbUtils.next(cb)); }, userListings: function (id, cb) { dbUtils.find(schemas.Listing, {assetId: id}, dbUtils.next(cb)); diff --git a/lib/payswarm.cfg b/lib/payswarm.cfg index 475388a..2ea72cf 100644 --- a/lib/payswarm.cfg +++ b/lib/payswarm.cfg @@ -1,8 +1,10 @@ { - "@context": "https://w3id.org/payswarm/v1", - "publicKey": { - "id": "https://dev.payswarm.com/i/authority/keys/1", - "privateKeyPem": "-----BEGIN RSA PRIVATE KEY-----\nMIIEowIBAAKCAQEAtwAuVHB6gddoZUT4WdGqXAdr2YnnKIzxyYxPQubeQ2+y7ZLG\njov9xYVhM/avm4NTRPili1NK5tyo8MQSAXbWNQMu7vYMuc5+CCpFpm1LrnQ4sWsR\nvaWSWNkFBZ8FGvcW7Yte/mefT+du1JBeB/eoafaK5qBQNj7qmNytvyDzOtxEtHUj\nJt9xfS2Jbox9j3MLHifEUMeoD5YErNjqOlVH98OT8x0cUCmbO6ujwD0Hd2RPh1If\nb+Q6Fp6XbLdu/36RL9SCSgRssCyVyvbcyTBemNHeRu/9J/G14qXW/SpyxnP7zmGP\nNX7ksnxG7gBj15zD03kzxrbaU5LObgI3bdDFXwIDAQABAoIBAC5/cUYrPjV3kiMJ\nH0FTMMIpcJHZpE59YYIgkJMjLh5cZ05OGP1nPJfPiB838u7Es4e21flMtJ9sOdDT\nQO/2Tf8yS96Tzi/387YHZ6Md6jjtduo9lkhlpYXFvqzq9tUfK0g4PW7OzX/0Agko\nlXvYxYYHCswGt9rQqbMlf1AtAyBVIXFklGTRFhfoveJ6smJABIabEgBIcz4jZxxd\nclSYjD2rEkPG60zWvfrjWhmN+NHINi/TrhruX40L74vJOjKAGtbQt+DHZ/8fDXe3\nNFVMFGIKyP1mw072g+797mfe1dJ7okk2Qgu/ea6FfiikDajdo3zpcO13Gyg4Pg2O\nbawGy4ECgYEA2ayQMTXqkA+fhlLmCMsAy0JUX1A6adkKJrRbP5EKUJKOIFxM7Bv1\n/FchyeTaL0XayWQ7rVN+8oBbo0FMpN23Hciw9wduNf+N7/QmGAy3JBl84EpXkbJb\nxxjax7f7VZPmeiR12d67fZ5i1mKeu4pssmbYN05Uv5htIq3DV2i4Vg8CgYEA1zjA\nRGIk/FjZYFhWAjB0W+vSCEdqsMxd6WmCLP9XIR2j5V71WE1ChTmAvBRzmI0GS8dP\nTFA6UY7UId0vS1XUSE/mn5d1q9vdXN1S0+rlL7QLlUJlH20SSnPrMxf3f1JiYyZQ\nobEDZWMxiOzBD5j1lOvIzl3RNvea573XBfxLa7ECgYEAjFNTrXXNnkuEEqsUgqyj\n+WTsUXm9/oido6/3dzZAiQrBtxjpufiYjrF5Jddz1K/ayKPmWOmP2DNpYAhzqYEJ\nUJkVhFr08LirvvoNKMnhstL/jvQ+Gb36rpJWUBRKYbP0C9+/XdHZ2rSlkQGIxOwL\nAMOONbE4rz9Lc+TDHnFzDH8CgYBtKnILvaR5AzAveF8X+S/sOC9u15q8Vs0Dyeqn\nnFS7jWdGvuW/hmDJZqNvwwfnRxD8evo0ATWzjLj4/FIy6jQlAbI/HPoo0/ryUajj\nqO/bRH3jlavpRs/SR/3zCqMVR9pz5Eld2oWYdbn4c+5xVOqsQPS4CEpIkUtXZKme\ndZxj4QKBgC6kn+elzr/if37W+eZbTyo7WhrRJqGttAs72isE5mL9ewijqFNjXC2y\nJHTKaBpBKv3RfOMCTCx/w5F+ONIY3VkePWEnEbcAI2Iy72DKP3imU8O0Sr5bVkDC\nPkvLiFTrq+kK7I6xuJfbYO/SIRIfN7PQsaAaymX10YQnuUYatTea\n-----END RSA PRIVATE KEY-----\n", - "publicKeyPem": "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAtwAuVHB6gddoZUT4WdGq\nXAdr2YnnKIzxyYxPQubeQ2+y7ZLGjov9xYVhM/avm4NTRPili1NK5tyo8MQSAXbW\nNQMu7vYMuc5+CCpFpm1LrnQ4sWsRvaWSWNkFBZ8FGvcW7Yte/mefT+du1JBeB/eo\nafaK5qBQNj7qmNytvyDzOtxEtHUjJt9xfS2Jbox9j3MLHifEUMeoD5YErNjqOlVH\n98OT8x0cUCmbO6ujwD0Hd2RPh1Ifb+Q6Fp6XbLdu/36RL9SCSgRssCyVyvbcyTBe\nmNHeRu/9J/G14qXW/SpyxnP7zmGPNX7ksnxG7gBj15zD03kzxrbaU5LObgI3bdDF\nXwIDAQAB\n-----END PUBLIC KEY-----\n" - } + "@context": "https://w3id.org/payswarm/v1", + "publicKey": { + "publicKeyPem": "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEApJTzBuohTPiqliU5Vu8o\nfVZcRIAR16BCVd1CdY65SGOfQuiN3xsK5T4ZGQQiyAogdpYhiGEqB/wgqNr3Wzjv\nC2jxBHLHsiNRGvWkRFqFA8axlqyTkXlSV9fXKbFX0hwrqSByy4JzaNxGA74wYBtH\n2b1nLEIGPE8biB+hywWADPNWSUO/QYm9LRGYuFbl/ieDB9kF8w+JMyzX3yYI45KS\nd979n2ucMgXZ7zMoY9cQKdnaqYINjtMhSW1oTJ03CY5N1v6y5Fx1G2m8fh+X1Qpl\n23LauzIa4T+wWCv7d34kE1DmQEOShtVc8rvpjp6Qz41HOz/bJSa8DAr3xUxPco9G\nGQIDAQAB\n-----END PUBLIC KEY-----\n", + "privateKeyPem": "-----BEGIN RSA PRIVATE KEY-----\nMIIEowIBAAKCAQEApJTzBuohTPiqliU5Vu8ofVZcRIAR16BCVd1CdY65SGOfQuiN\n3xsK5T4ZGQQiyAogdpYhiGEqB/wgqNr3WzjvC2jxBHLHsiNRGvWkRFqFA8axlqyT\nkXlSV9fXKbFX0hwrqSByy4JzaNxGA74wYBtH2b1nLEIGPE8biB+hywWADPNWSUO/\nQYm9LRGYuFbl/ieDB9kF8w+JMyzX3yYI45KSd979n2ucMgXZ7zMoY9cQKdnaqYIN\njtMhSW1oTJ03CY5N1v6y5Fx1G2m8fh+X1Qpl23LauzIa4T+wWCv7d34kE1DmQEOS\nhtVc8rvpjp6Qz41HOz/bJSa8DAr3xUxPco9GGQIDAQABAoIBAHjDMm/oa/bmn4T8\nW06Gvdb5/0nkDzOAzCvk5lcMGrgbIUkfCrqiRSRgpFnOxxaxF5DsKD7BzO1++xfr\nU4UECaL9pZv1/MGhWGnHxHjDUsaqjLRafQ1JUDpUjfRxxFbPhNncjV72oWhX+KfW\nbfiXC+mhKIs5BwpJoZIIY9dsecEFvxZGl7P5OdWYc7+6/ap/CS6r6H9b1a2Z9XZq\nGmHldvQa6mXJn8G/HT2QOKSThRbhQjgNVxhofjUYcSqgBdQFT7rd1BEEK0cDw1eR\nfcie812QefSjRWog1uJjXFuS81zfxTWrepRZuKgscKSwykyhr3AUh59tR25HHJZr\n76kyxAECgYEAzo0959lGa8Zqw3MyjYeaMMBW+Pd27FaoHOsVEGLtPohug4q0o/AO\n8pusO1JBSmpb4/LSgYo46/Gp6iIg5d6t4Ttnwx8n/qPH3t+ezTgsrh9CPf2glSEe\nGvdT3tr1WCFjVV3HiJaXFxUjrkPmEcG/L/QtV4TV+aCMOx5GyckAEikCgYEAy/uI\n5bQQ0c/VVSmi7sWHYcs1GPmy/ahZcagMSB80NUNfG9QhB0YEMler8fDa159YsV9W\nwRhog83Ip8I48IMwTOvBGuBKPsl+Hw9hNG8ksRE4BnXy/y82Jf3xCGM2u+7Cf2/f\n/i9WLli71NFV6LrdJUelvpciANX5a10rkF4JcnECgYBcTnKj8k2uTHXZ8tlctoUJ\n1GsJyE21QOTQR56aPBuaHo6E6q/fs6B6e2d0+0WCZBW8wP+iNItLpiwxHh9lmyZJ\nyaqNYJcXDUp9J6JoQ/pztjR8T6Q8ARjbJDyvE1shj4o81DQfrmzHPAM+FcnzlYpD\ne/PncM3PSRhiMx2ff9wwQQKBgBWrSOWt9UN0oqMDY02eKj2XSrK2g+8yXR4XzgYz\nWmZ2G7pnFIMjSvrWGWwAPB8/zDo7eInWv/OQfspjdY0HQrBJMyBZx0lYOk+uYJMj\nY3Bz9dGp4gB90XDDw0Ey2POp73t+NPtZp/wQbRO0kT3B7BAzxkWy5GfWU0K2iRQz\nCSnhAoGBAMnJ5266sq9ETo0taO15B7pkBLE48+jmLkYMRmu4iHnGYlqJcQxh/evv\nDZ8XbysUGgmT3TcEXqg/lwL8WxXtvqDCOlA7SIncf4tRW1RjcntWfCduWOP8SAe1\n+yXmQQnoqiBCSGswXLFtv3udWCbSJ5rl8e/dKFSMDuDUUXhKLaKK\n-----END RSA PRIVATE KEY-----\n", + "id": "https://dev.payswarm.com/i/webpayments/keys/3" + }, + "owner": "https://dev.payswarm.com/i/webpayments", + "source": "https://dev.payswarm.com/i/webpayments/accounts/primary" } \ No newline at end of file diff --git a/lib/schemas.js b/lib/schemas.js index 40b7d82..579759d 100644 --- a/lib/schemas.js +++ b/lib/schemas.js @@ -13,26 +13,47 @@ var UserSchema = new Schema({ username: String }); +var PayeeSchema = { + id: String, + type: 'Payee', + destination: String, + currency: String, + payeeGroup: [String], + payeeRate: Number, + payeeRateType: 'Percentage', + payeeApplyType: 'ApplyInclusively', + payeeApplyGroup: [String], + minimumAmount: Number, + comment: String +}; + var AssetSchema = { "@context": String, id: String, + listingId: String, type: Array, creator: { - fullName: String + fullName: String, + userId: String }, title: String, assetContent: String, assetProvider: String, signature : Object, - description: String, - userId: String, - listingId: Schema.Types.ObjectId + assetDescription: String, + listingRestrictions: { + validFrom: String, + validUntil: String, + payee: Object, + payeeRule: Object + } }; var ListingSchema = { "@context": String, id: String, + assetId: String, userId: String, type: Array, vendor: String, @@ -42,11 +63,9 @@ var ListingSchema = { assetHash: String, license: String, licenseHash: String, - validFrom: Date, - validUntil: Date, - signature: Object, - assetId: Schema.Types.ObjectId, - userId: String + validFrom: String, + validUntil: String, + signature: Object } module.exports = function (db) { diff --git a/output b/output index 7145363..ad0a981 100644 --- a/output +++ b/output @@ -1,204 +1,129 @@ -Express server listening on port 3000 -new asset undefined -GET /newasset 200 475ms - 2.08kb -GET /javascripts/libs/require.js 304 60ms -GET /images/signin.png 304 30ms -GET /stylesheets/topcoat-mobile-light.css 304 28ms -GET /stylesheets/style.css 200 129ms - 4.21kb -serving index -GET / 200 67ms - 1.81kb -GET /javascripts/libs/require.js 304 6ms -GET /images/signin.png 304 6ms -GET /stylesheets/topcoat-mobile-light.css 304 7ms -GET /stylesheets/style.css 304 4ms -new asset undefined -GET /newasset 304 100ms -GET /javascripts/libs/require.js 304 6ms -GET /images/signin.png 304 6ms -GET /stylesheets/topcoat-mobile-light.css 304 5ms -GET /stylesheets/style.css 304 5ms -GET /javascripts/main.js 304 10ms -GET /javascripts/main.js 304 2ms -GET /javascripts/app.js 304 4ms -GET /javascripts/event-handlers.js 304 2ms -GET /javascripts/app.js 304 4ms -GET /javascripts/message.js 304 2ms -GET /javascripts/event-assets.js 304 2ms -GET /javascripts/event-login.js 304 1ms -GET /javascripts/event-handlers.js 304 1ms -GET /javascripts/modal.js 304 1ms -GET /javascripts/message.js 304 3ms -GET /javascripts/event-assets.js 304 2ms -GET /javascripts/event-login.js 304 1ms -GET /javascripts/modal.js 304 1ms -new asset undefined -GET /newasset 200 85ms - 2.08kb -GET /javascripts/libs/require.js 200 26ms - 14.65kb -GET /images/signin.png 200 25ms - 1.95kb -GET /stylesheets/topcoat-mobile-light.css 200 25ms - 25.94kb -GET /stylesheets/style.css 200 25ms - 4.21kb -GET /javascripts/main.js 200 2ms - 50 -GET /javascripts/app.js 200 1ms - 133 -GET /javascripts/event-handlers.js 200 1ms - 991 -GET /javascripts/message.js 200 2ms - 773 -GET /javascripts/event-login.js 200 4ms - 1.29kb -GET /javascripts/event-assets.js 200 4ms - 2.1kb -GET /javascripts/modal.js 200 13ms - 1.21kb -new asset undefined -GET /newasset 304 83ms -new asset undefined -GET /newasset 200 118ms - 2.08kb -GET /javascripts/libs/require.js 304 26ms -GET /images/signin.png 304 26ms -GET /stylesheets/topcoat-mobile-light.css 304 26ms -GET /stylesheets/style.css 304 59ms -GET /javascripts/libs/require.js 200 7ms - 14.65kb -GET /images/signin.png 200 7ms - 1.95kb -GET /stylesheets/topcoat-mobile-light.css 200 7ms - 25.94kb -GET /stylesheets/style.css 200 8ms - 4.21kb -new asset undefined -GET /newasset 200 81ms - 2.08kb -GET /stylesheets/topcoat-mobile-light.css 200 1ms - 25.94kb -GET /javascripts/libs/require.js 200 8ms - 14.65kb -GET /images/signin.png 200 8ms - 1.95kb -GET /stylesheets/style.css 200 11ms - 4.21kb -GET /javascripts/main.js 304 2ms -GET /javascripts/app.js 304 2ms -GET /javascripts/event-handlers.js 304 1ms -GET /javascripts/message.js 304 1ms -GET /javascripts/event-assets.js 304 2ms -GET /javascripts/event-login.js 304 2ms -GET /javascripts/modal.js 304 5ms -GET /assets/5 200 10ms - 2 -GET /javascripts/main.js 200 16ms - 50 -GET /javascripts/app.js 200 1ms - 133 -GET /javascripts/event-handlers.js 200 1ms - 991 -GET /javascripts/message.js 200 1ms - 773 -GET /javascripts/event-login.js 200 4ms - 1.29kb -GET /javascripts/event-assets.js 200 1ms - 2.1kb -GET /javascripts/modal.js 200 1ms - 1.21kb -GET /assets/5 200 2ms - 2 -keys { '@context': 'https://w3id.org/payswarm/v1', - publicKey: - { id: 'https://dev.payswarm.com/i/authority/keys/1', - privateKeyPem: '-----BEGIN RSA PRIVATE KEY-----\nMIIEowIBAAKCAQEAtwAuVHB6gddoZUT4WdGqXAdr2YnnKIzxyYxPQubeQ2+y7ZLG\njov9xYVhM/avm4NTRPili1NK5tyo8MQSAXbWNQMu7vYMuc5+CCpFpm1LrnQ4sWsR\nvaWSWNkFBZ8FGvcW7Yte/mefT+du1JBeB/eoafaK5qBQNj7qmNytvyDzOtxEtHUj\nJt9xfS2Jbox9j3MLHifEUMeoD5YErNjqOlVH98OT8x0cUCmbO6ujwD0Hd2RPh1If\nb+Q6Fp6XbLdu/36RL9SCSgRssCyVyvbcyTBemNHeRu/9J/G14qXW/SpyxnP7zmGP\nNX7ksnxG7gBj15zD03kzxrbaU5LObgI3bdDFXwIDAQABAoIBAC5/cUYrPjV3kiMJ\nH0FTMMIpcJHZpE59YYIgkJMjLh5cZ05OGP1nPJfPiB838u7Es4e21flMtJ9sOdDT\nQO/2Tf8yS96Tzi/387YHZ6Md6jjtduo9lkhlpYXFvqzq9tUfK0g4PW7OzX/0Agko\nlXvYxYYHCswGt9rQqbMlf1AtAyBVIXFklGTRFhfoveJ6smJABIabEgBIcz4jZxxd\nclSYjD2rEkPG60zWvfrjWhmN+NHINi/TrhruX40L74vJOjKAGtbQt+DHZ/8fDXe3\nNFVMFGIKyP1mw072g+797mfe1dJ7okk2Qgu/ea6FfiikDajdo3zpcO13Gyg4Pg2O\nbawGy4ECgYEA2ayQMTXqkA+fhlLmCMsAy0JUX1A6adkKJrRbP5EKUJKOIFxM7Bv1\n/FchyeTaL0XayWQ7rVN+8oBbo0FMpN23Hciw9wduNf+N7/QmGAy3JBl84EpXkbJb\nxxjax7f7VZPmeiR12d67fZ5i1mKeu4pssmbYN05Uv5htIq3DV2i4Vg8CgYEA1zjA\nRGIk/FjZYFhWAjB0W+vSCEdqsMxd6WmCLP9XIR2j5V71WE1ChTmAvBRzmI0GS8dP\nTFA6UY7UId0vS1XUSE/mn5d1q9vdXN1S0+rlL7QLlUJlH20SSnPrMxf3f1JiYyZQ\nobEDZWMxiOzBD5j1lOvIzl3RNvea573XBfxLa7ECgYEAjFNTrXXNnkuEEqsUgqyj\n+WTsUXm9/oido6/3dzZAiQrBtxjpufiYjrF5Jddz1K/ayKPmWOmP2DNpYAhzqYEJ\nUJkVhFr08LirvvoNKMnhstL/jvQ+Gb36rpJWUBRKYbP0C9+/XdHZ2rSlkQGIxOwL\nAMOONbE4rz9Lc+TDHnFzDH8CgYBtKnILvaR5AzAveF8X+S/sOC9u15q8Vs0Dyeqn\nnFS7jWdGvuW/hmDJZqNvwwfnRxD8evo0ATWzjLj4/FIy6jQlAbI/HPoo0/ryUajj\nqO/bRH3jlavpRs/SR/3zCqMVR9pz5Eld2oWYdbn4c+5xVOqsQPS4CEpIkUtXZKme\ndZxj4QKBgC6kn+elzr/if37W+eZbTyo7WhrRJqGttAs72isE5mL9ewijqFNjXC2y\nJHTKaBpBKv3RfOMCTCx/w5F+ONIY3VkePWEnEbcAI2Iy72DKP3imU8O0Sr5bVkDC\nPkvLiFTrq+kK7I6xuJfbYO/SIRIfN7PQsaAaymX10YQnuUYatTea\n-----END RSA PRIVATE KEY-----\n', - publicKeyPem: '-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAtwAuVHB6gddoZUT4WdGq\nXAdr2YnnKIzxyYxPQubeQ2+y7ZLGjov9xYVhM/avm4NTRPili1NK5tyo8MQSAXbW\nNQMu7vYMuc5+CCpFpm1LrnQ4sWsRvaWSWNkFBZ8FGvcW7Yte/mefT+du1JBeB/eo\nafaK5qBQNj7qmNytvyDzOtxEtHUjJt9xfS2Jbox9j3MLHifEUMeoD5YErNjqOlVH\n98OT8x0cUCmbO6ujwD0Hd2RPh1Ifb+Q6Fp6XbLdu/36RL9SCSgRssCyVyvbcyTBe\nmNHeRu/9J/G14qXW/SpyxnP7zmGPNX7ksnxG7gBj15zD03kzxrbaU5LObgI3bdDF\nXwIDAQAB\n-----END PUBLIC KEY-----\n' } } -auth doc { _id: 51e96cc8a0e24c65b0000001, - owner: 'https://dev.payswarm.com/i/piatra', - username: 'piatra' } -body { audience: 'http://localhost:3000', - expires: 1374255511620, - issuer: 'login.persona.org', - email: 'andrei.br92@gmail.com', - status: 'okay', - registered: 'true', - publicKey: '-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAtwAuVHB6gddoZUT4WdGq\nXAdr2YnnKIzxyYxPQubeQ2+y7ZLGjov9xYVhM/avm4NTRPili1NK5tyo8MQSAXbW\nNQMu7vYMuc5+CCpFpm1LrnQ4sWsRvaWSWNkFBZ8FGvcW7Yte/mefT+du1JBeB/eo\nafaK5qBQNj7qmNytvyDzOtxEtHUjJt9xfS2Jbox9j3MLHifEUMeoD5YErNjqOlVH\n98OT8x0cUCmbO6ujwD0Hd2RPh1Ifb+Q6Fp6XbLdu/36RL9SCSgRssCyVyvbcyTBe\nmNHeRu/9J/G14qXW/SpyxnP7zmGPNX7ksnxG7gBj15zD03kzxrbaU5LObgI3bdDF\nXwIDAQAB\n-----END PUBLIC KEY-----\n' } -doc { _id: 51e96cc8a0e24c65b0000001, - owner: 'https://dev.payswarm.com/i/piatra', - username: 'piatra' } -POST /auth/verify 200 4389ms - 661 -serving index -GET / 200 69ms - 1.96kb -GET /stylesheets/topcoat-mobile-light.css 304 4ms -GET /stylesheets/style.css 304 7ms -GET /javascripts/libs/require.js 304 4ms -GET /javascripts/main.js 304 1ms -keys { '@context': 'https://w3id.org/payswarm/v1', - publicKey: - { id: 'https://dev.payswarm.com/i/authority/keys/1', - privateKeyPem: '-----BEGIN RSA PRIVATE KEY-----\nMIIEowIBAAKCAQEAtwAuVHB6gddoZUT4WdGqXAdr2YnnKIzxyYxPQubeQ2+y7ZLG\njov9xYVhM/avm4NTRPili1NK5tyo8MQSAXbWNQMu7vYMuc5+CCpFpm1LrnQ4sWsR\nvaWSWNkFBZ8FGvcW7Yte/mefT+du1JBeB/eoafaK5qBQNj7qmNytvyDzOtxEtHUj\nJt9xfS2Jbox9j3MLHifEUMeoD5YErNjqOlVH98OT8x0cUCmbO6ujwD0Hd2RPh1If\nb+Q6Fp6XbLdu/36RL9SCSgRssCyVyvbcyTBemNHeRu/9J/G14qXW/SpyxnP7zmGP\nNX7ksnxG7gBj15zD03kzxrbaU5LObgI3bdDFXwIDAQABAoIBAC5/cUYrPjV3kiMJ\nH0FTMMIpcJHZpE59YYIgkJMjLh5cZ05OGP1nPJfPiB838u7Es4e21flMtJ9sOdDT\nQO/2Tf8yS96Tzi/387YHZ6Md6jjtduo9lkhlpYXFvqzq9tUfK0g4PW7OzX/0Agko\nlXvYxYYHCswGt9rQqbMlf1AtAyBVIXFklGTRFhfoveJ6smJABIabEgBIcz4jZxxd\nclSYjD2rEkPG60zWvfrjWhmN+NHINi/TrhruX40L74vJOjKAGtbQt+DHZ/8fDXe3\nNFVMFGIKyP1mw072g+797mfe1dJ7okk2Qgu/ea6FfiikDajdo3zpcO13Gyg4Pg2O\nbawGy4ECgYEA2ayQMTXqkA+fhlLmCMsAy0JUX1A6adkKJrRbP5EKUJKOIFxM7Bv1\n/FchyeTaL0XayWQ7rVN+8oBbo0FMpN23Hciw9wduNf+N7/QmGAy3JBl84EpXkbJb\nxxjax7f7VZPmeiR12d67fZ5i1mKeu4pssmbYN05Uv5htIq3DV2i4Vg8CgYEA1zjA\nRGIk/FjZYFhWAjB0W+vSCEdqsMxd6WmCLP9XIR2j5V71WE1ChTmAvBRzmI0GS8dP\nTFA6UY7UId0vS1XUSE/mn5d1q9vdXN1S0+rlL7QLlUJlH20SSnPrMxf3f1JiYyZQ\nobEDZWMxiOzBD5j1lOvIzl3RNvea573XBfxLa7ECgYEAjFNTrXXNnkuEEqsUgqyj\n+WTsUXm9/oido6/3dzZAiQrBtxjpufiYjrF5Jddz1K/ayKPmWOmP2DNpYAhzqYEJ\nUJkVhFr08LirvvoNKMnhstL/jvQ+Gb36rpJWUBRKYbP0C9+/XdHZ2rSlkQGIxOwL\nAMOONbE4rz9Lc+TDHnFzDH8CgYBtKnILvaR5AzAveF8X+S/sOC9u15q8Vs0Dyeqn\nnFS7jWdGvuW/hmDJZqNvwwfnRxD8evo0ATWzjLj4/FIy6jQlAbI/HPoo0/ryUajj\nqO/bRH3jlavpRs/SR/3zCqMVR9pz5Eld2oWYdbn4c+5xVOqsQPS4CEpIkUtXZKme\ndZxj4QKBgC6kn+elzr/if37W+eZbTyo7WhrRJqGttAs72isE5mL9ewijqFNjXC2y\nJHTKaBpBKv3RfOMCTCx/w5F+ONIY3VkePWEnEbcAI2Iy72DKP3imU8O0Sr5bVkDC\nPkvLiFTrq+kK7I6xuJfbYO/SIRIfN7PQsaAaymX10YQnuUYatTea\n-----END RSA PRIVATE KEY-----\n', - publicKeyPem: '-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAtwAuVHB6gddoZUT4WdGq\nXAdr2YnnKIzxyYxPQubeQ2+y7ZLGjov9xYVhM/avm4NTRPili1NK5tyo8MQSAXbW\nNQMu7vYMuc5+CCpFpm1LrnQ4sWsRvaWSWNkFBZ8FGvcW7Yte/mefT+du1JBeB/eo\nafaK5qBQNj7qmNytvyDzOtxEtHUjJt9xfS2Jbox9j3MLHifEUMeoD5YErNjqOlVH\n98OT8x0cUCmbO6ujwD0Hd2RPh1Ifb+Q6Fp6XbLdu/36RL9SCSgRssCyVyvbcyTBe\nmNHeRu/9J/G14qXW/SpyxnP7zmGPNX7ksnxG7gBj15zD03kzxrbaU5LObgI3bdDF\nXwIDAQAB\n-----END PUBLIC KEY-----\n' } } -auth doc { _id: 51e96cc8a0e24c65b0000001, - owner: 'https://dev.payswarm.com/i/piatra', - username: 'piatra' } -body { audience: 'http://localhost:3000', - expires: 1374255516952, - issuer: 'login.persona.org', - email: 'andrei.br92@gmail.com', - status: 'okay', - registered: 'true', - publicKey: '-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAtwAuVHB6gddoZUT4WdGq\nXAdr2YnnKIzxyYxPQubeQ2+y7ZLGjov9xYVhM/avm4NTRPili1NK5tyo8MQSAXbW\nNQMu7vYMuc5+CCpFpm1LrnQ4sWsRvaWSWNkFBZ8FGvcW7Yte/mefT+du1JBeB/eo\nafaK5qBQNj7qmNytvyDzOtxEtHUjJt9xfS2Jbox9j3MLHifEUMeoD5YErNjqOlVH\n98OT8x0cUCmbO6ujwD0Hd2RPh1Ifb+Q6Fp6XbLdu/36RL9SCSgRssCyVyvbcyTBe\nmNHeRu/9J/G14qXW/SpyxnP7zmGPNX7ksnxG7gBj15zD03kzxrbaU5LObgI3bdDF\nXwIDAQAB\n-----END PUBLIC KEY-----\n' } -doc { _id: 51e96cc8a0e24c65b0000001, - owner: 'https://dev.payswarm.com/i/piatra', - username: 'piatra' } -POST /auth/verify 200 3520ms - 661 -GET /javascripts/app.js 304 1ms -GET /javascripts/event-handlers.js 304 1ms -GET /javascripts/event-login.js 304 2ms -GET /javascripts/message.js 304 1ms -GET /javascripts/event-assets.js 304 2ms -GET /javascripts/modal.js 304 0ms -GET /assets/5 200 6ms - 2 -GET /font/SourceSansPro-Regular.otf 404 5ms -GET /font/SourceSansPro-Semibold.otf 404 4ms -GET /font/SourceSansPro-Light.otf 404 3ms -GET /assets/created 200 2ms - 2 -GET /assets/created 200 9ms - 2 -new asset piatra -GET /newasset 200 113ms - 5.37kb -GET /stylesheets/topcoat-mobile-light.css 200 6ms - 25.94kb -GET /stylesheets/style.css 200 7ms - 4.21kb -GET /javascripts/libs/require.js 200 3ms - 14.65kb -GET /javascripts/main.js 200 19ms - 50 -GET /javascripts/app.js 200 1ms - 133 -GET /javascripts/event-handlers.js 200 1ms - 991 -GET /javascripts/event-assets.js 200 7ms - 2.1kb -GET /javascripts/event-login.js 200 7ms - 1.29kb -GET /javascripts/message.js 200 6ms - 773 -GET /javascripts/modal.js 200 1ms - 1.21kb -GET /assets/5 200 3ms - 2 -GET /font/SourceSansPro-Regular.otf 404 1ms -GET /font/SourceSansPro-Semibold.otf 404 1ms -GET /font/SourceSansPro-Light.otf 404 1ms -createListing -createAsset -POST /newasset/process/ 200 30ms - 2.86kb -{ '@context': 'https://w3id.org/payswarm/v1', - id: 'http://listings.dev.payswarm.com/mozhacks/html5-me-song#listing', - userId: '51e96cc8a0e24c65b0000001', - vendor: 'https://dev.payswarm.com/i/webpayments', - asset: 'http://listings.dev.payswarm.com/mozhacks/demo#asset', - assetHash: 'urn:sha256:a20f1c33367f5281e21bac61ea9a00e871b9b42761eabae00ff502f6507fc1c7', - license: 'https://w3id.org/payswarm/licenses/personal-use', - licenseHash: 'urn:sha256:a5917c762b776903d082b9f8390f6dd9e632b372f220a25713a0cdfa38729b94', - validFrom: Fri Jul 19 2013 03:00:00 GMT+0300 (EEST), - validUntil: Sat Jul 20 2013 03:00:00 GMT+0300 (EEST), - signature: - { signatureValue: 'SfvoKKV4jP2936c0g9hTPUKcjeIsVf/uMS5x3/KNZ9VULLc3emoaVxYMcSk7/v5pPDtBRaqCHc2ym5FZVsWDmfD4oIqmTf9yk/WcxwuAdhp+U32aX2ZR15oBQJ9h5UoI6Lc3xJ900jp6WggbQWw1knxSzbWOkCW337/wmNiVrURpxW+8wrdAES4+8yefnAEAXN3c4I5Hz3YPhzTWTWK/kD3ItYqOR+nJDTw4nLUBW6qIMRBhyLNV467h1eLlRtt0ZeONjXVsXf342ZP3Xpio/65qiNvWP3mZRWUDsTNX8QWxpVqkwr7cwpr52iCQXx2ccC+w/l0AbbicPg+E2rR+MQ==', - created: '2013-07-19T17:37:12Z', - creator: 'https://dev.payswarm.com/i/authority/keys/1', - type: 'GraphSignature2012' }, - _id: 51e9794ae404e772b6000001, - payeeRule: - [ { payeeApplyType: 'ApplyInclusively', - maximumPayeeRate: '5', - payeeRateType: 'Percentage', - payeeGroupPrefix: [Object], - type: 'PayeeRule' } ], - payee: - [ { comment: '123321', - payeeApplyType: 'ApplyExclusively', - currency: 'USD', - payeeRate: '2', - payeeRateType: 'FlatAmount', - payeeGroup: [Object], - destination: 'https://dev.payswarm.com/i/webpayments/accounts/primary', - type: 'Payee' } ], - type: [ 'Listing' ] } -{ '@context': 'https://w3id.org/payswarm/v1', - id: 'http://listings.dev.payswarm.com/mozhacks/demo#asset', - userId: '51e96cc8a0e24c65b0000001', - title: 'tren', - assetContent: 'http://listings.dev.payswarm.com/mozhacks/demo#asset', - assetProvider: 'https://dev.payswarm.com/i/piatra', - signature: - { signatureValue: 'fX3airvoC/+/huh5oxF3LGt3RWmEdIjT306d6PAuuWCXedZs9WmagIb0hWAlOlV85UIAja8ep3v19Mm483PJdQbZAD89JDp9YD7wisg3gk+pTZgQLekiZ+mcFfqhhRg1bJyesJyZkgYPQ9+gcZMhBvFjUyvvbW3fC1WrW4iqIDM3LNbDrHB1XBuSNrzTWNScNmNzStuIf9yqVAlbseOF6Yc4BQuhaGUR8MxSKmiah6feGMYfwdtEn7L2SS6YhzL8+2WEkgAjvVsN1XG8j+FieE04QbI17x/dglh+Ip61aU7ip0m5syewvO4cIc37T9o8hmTCI5GSnn3NmYGA0MA1oQ==', - created: '2013-07-19T17:37:12Z', - creator: 'https://dev.payswarm.com/i/authority/keys/1', - type: 'GraphSignature2012' }, - _id: 51e9794ae404e772b6000002, - creator: { fullName: 'Joe' }, - type: [ 'Asset' ] } -51e96cc8a0e24c65b0000001 -POST /newasset/save 500 9ms -GET /assets/created 200 2ms - 2 +Generating asset... +Signing asset... +Generating and signing listing... +Register signed asset and listing... +{ + "@context": "https://w3id.org/payswarm/v1", + "@graph": [ + { + "@context": "https://w3id.org/payswarm/v1", + "id": "https://webpayments.fwd.wf/assets/asset/1400b472708", + "listingId": "1400b472708", + "type": [ + "Asset", + "pto:WebPage" + ], + "creator": { + "fullName": "andrei.br92@gmail.com", + "userId": "51e96cc8a0e24c65b0000001" + }, + "title": "keon", + "assetContent": "https://webpayments.fwd.wf/assets/asset/1400b472708", + "assetProvider": "https://dev.payswarm.com/i/piatra", + "listingRestrictions": { + "validFrom": "2013-07-23T00:00:00Z", + "validUntil": "2013-07-31T00:00:00Z", + "payee": [ + { + "id": "https://webpayments.fwd.wf/assets/asset/1400b472708/payee", + "type": "Payee", + "destination": "https://dev.payswarm.com/i/webpayments/accounts/incoming-payments", + "currency": "USD", + "payeeGroup": [ + "assetProvider" + ], + "payeeRate": "80", + "payeeRateType": "Percentage", + "payeeApplyType": "ApplyInclusively", + "payeeApplyGroup": [ + "vendor" + ], + "minimumAmount": "0.01", + "comment": "Asset Provider Royalty" + } + ], + "payeeRule": [ + { + "type": "PayeeRule", + "payeeGroupPrefix": [ + "authority" + ] + }, + { + "type": "PayeeRule", + "payeeGroup": [ + "vendor" + ], + "payeeRateType": "FlatAmount", + "payeeApplyType": "ApplyExclusively" + } + ] + }, + "signature": { + "type": "GraphSignature2012", + "creator": "https://dev.payswarm.com/i/webpayments/keys/3", + "created": "2013-07-23T11:25:47Z", + "signatureValue": "MRwAkVIBlIbJPNnGd/+Mv6Ov5ywguRtATVEcMk71tsWPP62bQXT/EnpcDlOZPvVdRlFoXCCVKtJ+o6t5BE2zA4ko8De1CmwdE6bFidSVWpiPOIL+CEcOFCS9DbqO/zScLdHyu/KZZ4+PMm/2aaKK9Ucm4Tn0peAqVgIufHOwyPdVRqz1f+jrTmRKDYfLjYa8ZlfLIOXNRmu8z23/fClqOUM77L8CKDYnHDBe/vGulQ8fsykkW+CCD/7EkoS9MOL/z5EaFUAiVcfVFKRfpxcAJ/PmuxwLksbeW9WweHA1g3aGcEZSYJDMXbHmvILtgIu0GG5EwlNYfExSfCrUNjwW9Q==" + } + }, + { + "@context": "https://w3id.org/payswarm/v1", + "id": "https://webpayments.fwd.wf/listings/listing/1400b472708", + "assetId": "1400b472708", + "type": [ + "Listing", + "gr:Offering" + ], + "vendor": "https://dev.payswarm.com/i/piatra", + "payee": [ + { + "id": "https://webpayments.fwd.wf/listings/listing/1400b472708/payee", + "type": "Payee", + "destination": "https://dev.payswarm.com/i/webpayments/accounts/incoming-payments", + "currency": "USD", + "payeeGroup": [ + "vendor" + ], + "payeeRate": "2", + "payeeRateType": "FlatAmount", + "payeeApplyType": "ApplyExclusively", + "comment": "keon [1400b472708]." + } + ], + "payeeRule": [ + { + "type": "PayeeRule", + "payeeGroupPrefix": [ + "authority" + ], + "maximumPayeeRate": "10", + "payeeRateType": "Percentage", + "payeeApplyType": "ApplyInclusively" + } + ], + "asset": "https://webpayments.fwd.wf/assets/asset/1400b472708", + "assetHash": "urn:sha256:51331ea635cb74fc926da88cabede966c3705c7b62c7a4be25e2237bd9d5344e", + "license": "https://w3id.org/payswarm/licenses/blogging", + "licenseHash": "urn:sha256:d9dcfb7b3ba057df52b99f777747e8fe0fc598a3bb364e3d3eb529f90d58e1b9", + "validFrom": "2013-07-23T00:00:00Z", + "validUntil": "2013-07-31T00:00:00Z", + "signature": { + "type": "GraphSignature2012", + "creator": "https://dev.payswarm.com/i/webpayments/keys/3", + "created": "2013-07-23T11:25:47Z", + "signatureValue": "P3YSr1mHxMBaUDpy4VxzqZKeeT+DJd5PPzv1JFAOpHxwfa4QkjFjv73KriDrTkFvsTtNInxlMi1p2TDNXl79w4hz5sufuqSmC11gMVn65VFcRBdCogW94a7LYIPif3EEXMmSeGkvsOSUqmN/ia5DzfoFB6AfQApqa0xyNr6wQCswqi6DctVrLkox5HcpzT+kwrlEgXzWWI22QeFtcP0jsE8Mr8+8x2HfitRdsnKxQ+3jZe6ECF6L5x+IdCYVqRXgoBM01sFq6yimkIRl5nmF+cWEV8eIAjyAMz1xJ44nvznn9/ajUp9JKqfC4yso0GpRQiTImiJ4qNBgRHGg61FO5A==" + } + } + ] +} +{ '0': + { '@context': 'https://w3id.org/payswarm/v1', + '@graph': [ [Object], [Object] ] }, + '1': [Function] } +asset err null +listing err null +Registered signed asset: + https://webpayments.fwd.wf/assets/asset/1400b472708 +Registered signed listing: + https://webpayments.fwd.wf/listings/listing/1400b472708 +23 Jul 14:25:49 - [nodemon] exiting diff --git a/routes/assets.js b/routes/assets.js index 37029a9..c2e98b4 100644 --- a/routes/assets.js +++ b/routes/assets.js @@ -2,9 +2,176 @@ var asset = require('../lib/asset')(); var keys = require('../lib/keys')(); var payswarm = require('payswarm'); var fs = require('fs'); +var async = require('async'); +var _ = require('underscore'); var host = 'webpayments.fwd.wf'; var assets = { + + createAssetAndListing: function (req, res) { + var assetId = new Date().getTime().toString(16); + var url = 'http://localhost:3000/newasset/save'; + var k; + async.waterfall([ + function(callback) { + // read the config file from disk + keys.getKeyPair(function(err, keysPair) { + if(err) { + console.log('Error: Failed to find a PaySwarm configuration file.'); + return callback(err); + } + k = JSON.parse(keysPair); + callback(null, k); + }); + }, + function(keysPair, callback) { + // Step #1: Create the asset and digitally sign it + console.log("Generating asset..."); + var assetUrl = 'https://webpayments.fwd.wf/assets/asset/' + assetId; + var asset = { + '@context': payswarm.CONTEXT_URL, + id: assetUrl, + listingId: assetId, + type: ['Asset', 'pto:WebPage'], + creator: { + fullName: req.body.email, + userId: req.body.userId + }, + title: req.body.title, + assetContent: assetUrl, + assetProvider: req.body.owner, + listingRestrictions: { + validFrom: payswarm.w3cDate(new Date(req.body.validFrom)), + validUntil: payswarm.w3cDate(new Date(req.body.validUntil)), + payee: [{ + id: assetUrl + '/payee', + type: 'Payee', + destination: req.body.source, + currency: 'USD', + payeeGroup: ['assetProvider'], + destination: 'https://dev.payswarm.com/i/webpayments/accounts/incoming-payments', + payeeRate: '80', + payeeRateType: 'Percentage', + payeeApplyType: 'ApplyInclusively', + payeeApplyGroup: ['vendor'], + minimumAmount: '0.01', + comment: 'Asset Provider Royalty' + }], + payeeRule: [{ + type: 'PayeeRule', + payeeGroupPrefix: ['authority'] + }, { + type: 'PayeeRule', + payeeGroup: ['vendor'], + payeeRateType: 'FlatAmount', + payeeApplyType: 'ApplyExclusively' + }] + } + }; + + // sign the asset + payswarm.sign(asset, { + publicKeyId: keysPair.publicKey.id, + privateKeyPem: keysPair.publicKey.privateKeyPem + }, callback); + }, + function(signedAsset, callback) { + // generate a hash for the signed asset + console.log("Signing asset..."); + payswarm.hash(signedAsset, function(err, assetHash) { + callback(err, signedAsset, assetHash); + }); + }, + function(signedAsset, assetHash, callback) { + // Step #2: Create and digitally sign the listing + console.log('Generating and signing listing...'); + var listingUrl = 'https://webpayments.fwd.wf/listings/listing/' + assetId; + var assetUrl = 'https://webpayments.fwd.wf/assets/asset/' + assetId; + + var listing = { + '@context': payswarm.CONTEXT_URL, + id: listingUrl, + assetId: assetId, + type: ['Listing', 'gr:Offering'], + vendor: req.body.owner, + payee: [{ + id: listingUrl + '/payee', + type: 'Payee', + destination: 'https://dev.payswarm.com/i/webpayments/accounts/incoming-payments', + currency: 'USD', + payeeGroup: ['vendor'], + payeeRate: req.body.price, + payeeRateType: 'FlatAmount', + payeeApplyType: 'ApplyExclusively', + comment: req.body.comment + ' [' + assetId + '].' + }], + payeeRule : [{ + type: 'PayeeRule', + payeeGroupPrefix: ['authority'], + maximumPayeeRate: '10', + payeeRateType: 'Percentage', + payeeApplyType: 'ApplyInclusively' + }], + asset: assetUrl, + assetHash: assetHash, + license: 'https://w3id.org/payswarm/licenses/blogging', + licenseHash: 'urn:sha256:' + + 'd9dcfb7b3ba057df52b99f777747e8fe0fc598a3bb364e3d3eb529f90d58e1b9', + validFrom: payswarm.w3cDate(new Date(req.body.validFrom)), + validUntil: payswarm.w3cDate(new Date(req.body.validUntil)) + }; + + // sign the listing + payswarm.sign(listing, { + publicKeyId: k.publicKey.id, + privateKeyPem: k.publicKey.privateKeyPem + }, function(err, signedListing) { + callback(err, signedAsset, signedListing); + }); + }, + function(signedAsset, signedListing, callback) { + // Step #3: Register the signed asset and listing + console.log("Register signed asset and listing..."); + var assetAndListing = { + '@context': payswarm.CONTEXT_URL, + '@graph': [signedAsset, signedListing] + }; + + console.log(JSON.stringify(assetAndListing, null, 2)); + + fs.writeFile(__dirname + '/assets/' + assetId, JSON.stringify(assetAndListing, null, 2), function (err) { + if (err) { + console.log(err); + } else { + asset.save(assetAndListing, function(err, result) { + callback(err, assetAndListing); + }); + } + }) + }, + function(assetAndListing, callback) { + // display registration details + var debug = 0; + if(debug) { + console.log('Registered signed asset and listing: ' + + JSON.stringify(assetAndListing, null, 2)); + } + else { + console.log('Registered signed asset:\n ', + assetAndListing['@graph'][0].id); + console.log('Registered signed listing:\n ', + assetAndListing['@graph'][1].id); + } + callback(null); + } + ], function(err) { + if(err) { + console.log('Failed to register signed asset and listing:', + err.toString()); + } + }); + }, + processAsset : function (req, res) { asset.sign(req, function (err, asset, listing) { @@ -48,59 +215,50 @@ var assets = { // this is a big FIXME if (!req.session.identity) res.end('not logged in '); else { - asset.getOneListing({'assetId' : req.params.id}, function (listing) { - keys.getKeyPair(function (err, keys) { - if (err) { - console.log('error reading keys while making purchase'); - res.end('error'); - } else { - keys = JSON.parse(keys); - listing = listing[0]; - listing["@context"] = "https://w3id.org/payswarm/v1"; - fs.readFile(__dirname + '/../lib/listing.simple.cfg', 'utf8', function (err, data) { - json = JSON.parse(data); - var listing2 = {}; - for (var i in json) { - listing2[i] = listing[i]; - } - //FIXME - listing2.asset = 'http://'+host+'/assets/asset/' + listing.assetId; - listing2.id = 'http://'+host+'/listings/listing/' + listing['_id']; - payswarm.purchase(listing2, { - transactionService: 'https://dev.payswarm.com/transactions', - customer: req.session.identity, - source: req.session.identity, - privateKeyPem: keys.publicKey.privateKeyPem, - publicKey: keys.publicKey.id, - verbose: true - }, function(err, receipt) { - if (err) { - console.log(JSON.stringify(err, null,2)); - res.json([listing2,keys.publicKey.privateKeyPem,keys.publicKey.id,req.session.identity]); - } else { - console.log('Receipt:', receipt); - console.log('Transaction ID:', receipt.contract.id); - } - }); - }) - } - }) + keys.getKeyPair(function(err, k) { + k = JSON.parse(k); + fs.readFile(__dirname + '/assets/' + req.params.id, function (err, data) { + json = JSON.parse(data); + payswarm.purchase(json['@graph'][1], { + transactionService: 'https://dev.payswarm.com/transactions', + customer: req.session.identity, + source: req.session.identity, + privateKeyPem: k.publicKey.privateKeyPem, + publicKey: 'https://dev.payswarm.com/i/webpayments/keys/3', + verbose: true + }, function(err, receipt) { + if (err) { + console.log(JSON.stringify(err, null,2)); + } else { + console.log('Receipt:', receipt); + console.log('Transaction ID:', receipt.contract.id); + } + }); - }); + }) + }) } }, getListing: function (req, res) { - var query = {'_id': req.params.id}; + // fs.readFile(__dirname + '/assets/' + req.params.id, function (err, data) { + // data = JSON.parse(data); + // res.json(data['@graph'][1]); + // }); + var query = {'assetId': req.params.id}; asset.getListing(query, function (doc) { res.json(doc); }); }, getAsset: function (req, res) { - var query = {'_id': req.params.id}; + // fs.readFile(__dirname + '/assets/' + req.params.id, function (err, data) { + // data = JSON.parse(data); + // res.json(data['@graph'][0]); + // }); + var query = {'listingId': req.params.id}; asset.getAsset(query, function (doc) { res.json(doc); }); @@ -138,8 +296,40 @@ var assets = { } }, + resignListing: function (req, res) { + var query = {'_id' : req.params.id}; + asset.getListing(query, function (doc) { + keys.getKeyPair(function (err, keys) { + var keys = JSON.parse(keys); + doc.signature = {}; + var listing = { + '@context': payswarm.CONTEXT_URL, + id: doc.id, + type: ['Listing', 'gr:Offering'], + vendor: doc.vendor, + payee: doc.payee, + payeeRule : doc.payeeRule, + asset: doc.asset, + assetHash: doc.assetHash, + license: 'https://w3id.org/payswarm/licenses/blogging', + licenseHash: 'urn:sha256:' + + 'd9dcfb7b3ba057df52b99f777747e8fe0fc598a3bb364e3d3eb529f90d58e1b9', + validFrom: doc.validFrom, + validUntil: doc.validUntil + }; + payswarm.sign(listing, { + publicKeyId: keys.publicKey.id, + privateKeyPem: keys.publicKey.privateKeyPem + }, function(err, signedListing) { + console.log(err, signedListing); + }); + }) + }); + }, + getUserAssets: function (req, res) { var query = { email: req.session.email }; + console.log(query); asset.getUserAssets(query, function (assets) { res.json(assets); }); diff --git a/routes/assets/1400bca6fe7 b/routes/assets/1400bca6fe7 new file mode 100644 index 0000000..49fcecf --- /dev/null +++ b/routes/assets/1400bca6fe7 @@ -0,0 +1,114 @@ +{ + "@context": "https://w3id.org/payswarm/v1", + "@graph": [ + { + "@context": "https://w3id.org/payswarm/v1", + "id": "https://webpayments.fwd.wf/assets/asset/1400bca6fe7", + "listingId": "1400bca6fe7", + "type": [ + "Asset", + "pto:WebPage" + ], + "creator": { + "fullName": "andrei.br92@gmail.com", + "userId": "51e96cc8a0e24c65b0000001" + }, + "title": "keon", + "assetContent": "https://webpayments.fwd.wf/assets/asset/1400bca6fe7", + "assetProvider": "https://dev.payswarm.com/i/piatra", + "listingRestrictions": { + "validFrom": "2013-07-23T00:00:00Z", + "validUntil": "2013-07-27T00:00:00Z", + "payee": [ + { + "id": "https://webpayments.fwd.wf/assets/asset/1400bca6fe7/payee", + "type": "Payee", + "destination": "https://dev.payswarm.com/i/webpayments/accounts/incoming-payments", + "currency": "USD", + "payeeGroup": [ + "assetProvider" + ], + "payeeRate": "80", + "payeeRateType": "Percentage", + "payeeApplyType": "ApplyInclusively", + "payeeApplyGroup": [ + "vendor" + ], + "minimumAmount": "0.01", + "comment": "Asset Provider Royalty" + } + ], + "payeeRule": [ + { + "type": "PayeeRule", + "payeeGroupPrefix": [ + "authority" + ] + }, + { + "type": "PayeeRule", + "payeeGroup": [ + "vendor" + ], + "payeeRateType": "FlatAmount", + "payeeApplyType": "ApplyExclusively" + } + ] + }, + "signature": { + "type": "GraphSignature2012", + "creator": "https://dev.payswarm.com/i/webpayments/keys/3", + "created": "2013-07-23T13:49:11Z", + "signatureValue": "DQ1xgEquniPLxgv96Yizqm/H+AZdCk0IubU1d4esmJwBdrJczMXW9FXsuVgu69SCgIXlXw5N95DiVGpjg9jHBanKmCf11J0Gzn/JGq/3xX3QTd38a0pNpanuRBVgcqvdGEwX+HVWeT1UirJKMWWBR8NlrhQf9iwewr5Ltp3V6ZEX5MrA9fbXm9LVo1XBOJtjnkYORpqbHuuqhfS9thRGzIzInwsuUbNskuTGzEbQyrdjpeAMaK2ZB2tr3XbzE42sfTUeKUnmFWSVdC8sKnxE8OmFOOdqQD462WcSmV1qPbtMt++GuRBUg2PLGQHxgrVR7+Sc1SEaB9GUm4zRLD8aYg==" + } + }, + { + "@context": "https://w3id.org/payswarm/v1", + "id": "https://webpayments.fwd.wf/listings/listing/1400bca6fe7", + "assetId": "1400bca6fe7", + "type": [ + "Listing", + "gr:Offering" + ], + "vendor": "https://dev.payswarm.com/i/piatra", + "payee": [ + { + "id": "https://webpayments.fwd.wf/listings/listing/1400bca6fe7/payee", + "type": "Payee", + "destination": "https://dev.payswarm.com/i/webpayments/accounts/incoming-payments", + "currency": "USD", + "payeeGroup": [ + "vendor" + ], + "payeeRate": "2", + "payeeRateType": "FlatAmount", + "payeeApplyType": "ApplyExclusively", + "comment": "keon [1400bca6fe7]." + } + ], + "payeeRule": [ + { + "type": "PayeeRule", + "payeeGroupPrefix": [ + "authority" + ], + "maximumPayeeRate": "10", + "payeeRateType": "Percentage", + "payeeApplyType": "ApplyInclusively" + } + ], + "asset": "https://webpayments.fwd.wf/assets/asset/1400bca6fe7", + "assetHash": "urn:sha256:0b5fde2dda58fd5e97c7c8a8c4f4b0f8086d0ca63cdf4266dfd68f95724d0315", + "license": "https://w3id.org/payswarm/licenses/blogging", + "licenseHash": "urn:sha256:d9dcfb7b3ba057df52b99f777747e8fe0fc598a3bb364e3d3eb529f90d58e1b9", + "validFrom": "2013-07-23T00:00:00Z", + "validUntil": "2013-07-27T00:00:00Z", + "signature": { + "type": "GraphSignature2012", + "creator": "https://dev.payswarm.com/i/webpayments/keys/3", + "created": "2013-07-23T13:49:11Z", + "signatureValue": "Lgx4zT4ejBRTNX2OKln12J8Ob8DtJVSx9xPa0lCgRZ5j9OKee2zz047SYNPejYkzxvpP+YPTIe/RWiZKCDHeM410dXnNlag/tWxc5YoMtNDJJJzrZnYwUBUkZuGLxP/ZPNQQEpizOlWUCk6Hkx0CPygdqEvO2eHi2JXfZ4TZFwoDl+HR+b3TA575TWILOiIPThi7kJAUbUnGNH+zGgIuc648HZYQLr7G60ZZHvAWlQgCFtOU8h+EJvrp2XpfwhWsECJV4Eqm89xWCZcaKktgcLzuwxErDthi2LGoPULuj1UH45SIrdEkgezBXH5bF6SmV/IbVEypEPyYOZCJgoyPjw==" + } + } + ] +} \ No newline at end of file diff --git a/routes/assets/1400bdcfa36 b/routes/assets/1400bdcfa36 new file mode 100644 index 0000000..4c91361 --- /dev/null +++ b/routes/assets/1400bdcfa36 @@ -0,0 +1,114 @@ +{ + "@context": "https://w3id.org/payswarm/v1", + "@graph": [ + { + "@context": "https://w3id.org/payswarm/v1", + "id": "https://webpayments.fwd.wf/assets/asset/1400bdcfa36", + "listingId": "1400bdcfa36", + "type": [ + "Asset", + "pto:WebPage" + ], + "creator": { + "fullName": "andrei.br92@gmail.com", + "userId": "51e96cc8a0e24c65b0000001" + }, + "title": "keon", + "assetContent": "https://webpayments.fwd.wf/assets/asset/1400bdcfa36", + "assetProvider": "https://dev.payswarm.com/i/piatra", + "listingRestrictions": { + "validFrom": "2013-07-23T00:00:00Z", + "validUntil": "2013-07-31T00:00:00Z", + "payee": [ + { + "id": "https://webpayments.fwd.wf/assets/asset/1400bdcfa36/payee", + "type": "Payee", + "destination": "https://dev.payswarm.com/i/webpayments/accounts/incoming-payments", + "currency": "USD", + "payeeGroup": [ + "assetProvider" + ], + "payeeRate": "80", + "payeeRateType": "Percentage", + "payeeApplyType": "ApplyInclusively", + "payeeApplyGroup": [ + "vendor" + ], + "minimumAmount": "0.01", + "comment": "Asset Provider Royalty" + } + ], + "payeeRule": [ + { + "type": "PayeeRule", + "payeeGroupPrefix": [ + "authority" + ] + }, + { + "type": "PayeeRule", + "payeeGroup": [ + "vendor" + ], + "payeeRateType": "FlatAmount", + "payeeApplyType": "ApplyExclusively" + } + ] + }, + "signature": { + "type": "GraphSignature2012", + "creator": "https://dev.payswarm.com/i/webpayments/keys/3", + "created": "2013-07-23T14:09:26Z", + "signatureValue": "b43ZDG2J9C9VRwCR9JCKUTeczxh3tAVHka10gLc6Sz7PK18PjZUezIKVrh6dMha209Ctq/iiMJyVzXcQHQseePOlDT2DJe8LdXd34EARXvttNC+o3uynBlDFCnwYFxFuM3JSRGH1hfhrVc0VAdSsj8W8962oQuNbPTw7xoxthU6z9q1R5Iu1inlCP44XUugsozTF5SquZg8xidfJTD/35zdBNf7nWo9yqpWc926sp+H7eyVpJJq5gBy10j0+N4DVSozOgaPy9i7UX245tfwV5fUKdUosqSC7QE8JvwjQVZWAWM+Vg2Qe8t7l7Px8qGzxS/VHP5/8+sRJiXlBDPcgZQ==" + } + }, + { + "@context": "https://w3id.org/payswarm/v1", + "id": "https://webpayments.fwd.wf/listings/listing/1400bdcfa36", + "assetId": "1400bdcfa36", + "type": [ + "Listing", + "gr:Offering" + ], + "vendor": "https://dev.payswarm.com/i/piatra", + "payee": [ + { + "id": "https://webpayments.fwd.wf/listings/listing/1400bdcfa36/payee", + "type": "Payee", + "destination": "https://dev.payswarm.com/i/webpayments/accounts/incoming-payments", + "currency": "USD", + "payeeGroup": [ + "vendor" + ], + "payeeRate": "2", + "payeeRateType": "FlatAmount", + "payeeApplyType": "ApplyExclusively", + "comment": "keon [1400bdcfa36]." + } + ], + "payeeRule": [ + { + "type": "PayeeRule", + "payeeGroupPrefix": [ + "authority" + ], + "maximumPayeeRate": "10", + "payeeRateType": "Percentage", + "payeeApplyType": "ApplyInclusively" + } + ], + "asset": "https://webpayments.fwd.wf/assets/asset/1400bdcfa36", + "assetHash": "urn:sha256:9e4b373e9faa551fedf732345965692c0895be49a96dd0e09c53d74f1ab05910", + "license": "https://w3id.org/payswarm/licenses/blogging", + "licenseHash": "urn:sha256:d9dcfb7b3ba057df52b99f777747e8fe0fc598a3bb364e3d3eb529f90d58e1b9", + "validFrom": "2013-07-23T00:00:00Z", + "validUntil": "2013-07-31T00:00:00Z", + "signature": { + "type": "GraphSignature2012", + "creator": "https://dev.payswarm.com/i/webpayments/keys/3", + "created": "2013-07-23T14:09:26Z", + "signatureValue": "mdMldVm9nIgSVpJVgLCKIDeXXf2A29K/0RHEIYx8lbHjJD/jdw877bJztwPiU48nZLtJ2yj03ehoyfiPANqG2vpxVug5cGmRNrvdrP0lKZtdMd/aeOxqShLb8YWwubcCeARuix9LY04+JemMlG2QM+MUY0a1QJFOMskL2gX7xDeaQJ16eACgTOTtG68KIGW82qyG8C5Iq7g3XD+CtUns2cCXD8+ECsOdWtkrCAyLwC/URiVdNBApAPbRfeOAcwzB5AadiqTXed2lkchaIF4he4+/yxdmJA0erceAlU4phl03qLvSj5TyQ0TIt54GLyzUwMFsSG5Cw1wCcKD/LeDJ9w==" + } + } + ] +} \ No newline at end of file diff --git a/routes/auth.js b/routes/auth.js index e5e8c2c..fcfa9b7 100644 --- a/routes/auth.js +++ b/routes/auth.js @@ -63,7 +63,6 @@ var auth = { returnKeys: function (req, res, body, keyPair) { keyPair = JSON.parse(keyPair); - console.log('keys', keyPair); body.publicKey = keyPair.publicKey.publicKeyPem; req.session.email = body.email; user.get({owner: 1, username: 1}, {email: body.email}, function (err, doc) { @@ -74,8 +73,6 @@ var auth = { req.session.userid = doc['_id']; req.session.identity = doc.owner; req.session.username = doc.username; - console.log('body', body); - console.log('doc', doc); res.json(body); } }) diff --git a/routes/index.js b/routes/index.js index 8885a45..0a4d682 100644 --- a/routes/index.js +++ b/routes/index.js @@ -8,8 +8,9 @@ var assets = require('../lib/asset.js')(); exports.index = function(req, res) { console.log('serving index'); + console.log('getting all assets'); assets.getUserAssets({}, function (assets) { - + console.log(assets); res.render('index', { title: title, user: (req.session.email) ? req.session.email : null, diff --git a/views/index.jade b/views/index.jade index ba780d0..7413875 100644 --- a/views/index.jade +++ b/views/index.jade @@ -18,5 +18,5 @@ block content li h4= asset.asset.title p comment - a.topcoat-button--cta(href='/assets/' + asset.asset['_id'] + '/purchase') Buy + a.topcoat-button--cta(href='/assets/' + asset.asset.listingId + '/purchase') Buy - }) \ No newline at end of file diff --git a/views/newasset.jade b/views/newasset.jade index d84a213..818deb1 100644 --- a/views/newasset.jade +++ b/views/newasset.jade @@ -39,7 +39,7 @@ block content tr td: label Price td - input.topcoat-text-input(type='number', step=0.01, name='payeeRate', value=2) + input.topcoat-text-input(type='number', step=0.01, name='price', value=2) select.docNav(name='currency')