Compare commits
44 Commits
Author | SHA1 | Date | |
---|---|---|---|
|
467f9a53b2 | ||
|
7a08960414 | ||
|
89909747f1 | ||
|
202e695e07 | ||
|
48e8e79659 | ||
|
abb49f2cf3 | ||
|
d1cd2a5213 | ||
|
27317844e0 | ||
|
ee74e2fa90 | ||
|
5d8bd2e6f8 | ||
|
cd4c7aeab8 | ||
|
e37c3cf1b9 | ||
|
8858bab985 | ||
|
afb0c332cc | ||
|
82c58c5c0c | ||
|
46bdd27431 | ||
|
1adfba1a37 | ||
|
54e55b1b0d | ||
|
08d37cc7f7 | ||
|
aa781957e8 | ||
|
c00477c93c | ||
|
035f09ac05 | ||
|
36e00bb29e | ||
|
10623873e8 | ||
|
e536ba1019 | ||
|
85fc36d710 | ||
|
5d5ae164f3 | ||
|
79309c75df | ||
|
4b58c8d356 | ||
|
8f0d6260b0 | ||
|
93a83a35da | ||
|
4efc5d47d9 | ||
|
ff8ef54e34 | ||
|
814a49812a | ||
|
e0610bc1be | ||
|
962976c204 | ||
|
16080bdc16 | ||
|
20ce741341 | ||
|
13bb094fb3 | ||
|
b43a55ffda | ||
|
45cbdcce70 | ||
|
1950cc8db0 | ||
|
90cfe0ec57 | ||
|
87e28548b9 |
@@ -134,7 +134,6 @@ forward on GETs.
|
||||
|
||||
All of which are optional except `type` with very logical default values.
|
||||
|
||||
|
||||
## Author
|
||||
|
||||
John Crepezzi <john.crepezzi@gmail.com>
|
||||
@@ -143,7 +142,7 @@ John Crepezzi <john.crepezzi@gmail.com>
|
||||
|
||||
(The MIT License)
|
||||
|
||||
Copyright © 2011 John Crepezzi
|
||||
Copyright © 2011-2012 John Crepezzi
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||
this software and associated documentation files (the ‘Software’), to deal in
|
||||
|
3
about.md
3
about.md
@@ -38,7 +38,8 @@ right now.
|
||||
|
||||
## Duration
|
||||
|
||||
Pastes will stay for 30 days from their last view.
|
||||
Pastes will stay for 30 days from their last view. They may be removed earlier
|
||||
and without notice.
|
||||
|
||||
## Privacy
|
||||
|
||||
|
@@ -1,6 +1,6 @@
|
||||
{
|
||||
|
||||
"host": "localhost",
|
||||
"host": "0.0.0.0",
|
||||
"port": 7777,
|
||||
|
||||
"keyLength": 10,
|
||||
@@ -25,7 +25,7 @@
|
||||
|
||||
"storage": {
|
||||
"type": "redis",
|
||||
"host": "localhost",
|
||||
"host": "0.0.0.0",
|
||||
"port": 6379,
|
||||
"db": 2,
|
||||
"expire": 2592000
|
||||
|
@@ -15,12 +15,23 @@ var DocumentHandler = function(options) {
|
||||
DocumentHandler.defaultKeyLength = 10;
|
||||
|
||||
// Handle retrieving a document
|
||||
DocumentHandler.prototype.handleGet = function(key, response, skipExpire) {
|
||||
DocumentHandler.prototype.handleGet = function(key, callback, response, skipExpire) {
|
||||
this.store.get(key, function(ret) {
|
||||
if (ret) {
|
||||
winston.verbose('retrieved document', { key: key });
|
||||
var responseData = JSON.stringify({ data: ret, key: key });
|
||||
if (callback) {
|
||||
if (callback.match(/^[a-z0-9]+$/i)) {
|
||||
response.writeHead(200, { 'content-type': 'application/javascript' });
|
||||
response.end(callback + '(' + responseData + ');');
|
||||
} else {
|
||||
response.writeHead(400, { 'content-type': 'application/json' });
|
||||
response.end(JSON.stringify({ message: 'invalid callback function name' }));
|
||||
}
|
||||
} else {
|
||||
response.writeHead(200, { 'content-type': 'application/json' });
|
||||
response.end(JSON.stringify({ data: ret, key: key }));
|
||||
response.end(responseData);
|
||||
}
|
||||
}
|
||||
else {
|
||||
winston.warn('document not found', { key: key });
|
||||
|
@@ -8,9 +8,13 @@ var winston = require('winston');
|
||||
// options[db] - The db to use (default 0)
|
||||
// options[expire] - The time to live for each key set (default never)
|
||||
|
||||
var RedisDocumentStore = function(options) {
|
||||
var RedisDocumentStore = function(options, client) {
|
||||
this.expire = options.expire;
|
||||
if (!RedisDocumentStore.client) {
|
||||
if (client) {
|
||||
winston.info('using predefined redis client');
|
||||
RedisDocumentStore.client = client;
|
||||
} else if (!RedisDocumentStore.client) {
|
||||
winston.info('configuring redis');
|
||||
RedisDocumentStore.connect(options);
|
||||
}
|
||||
};
|
||||
@@ -25,7 +29,7 @@ RedisDocumentStore.connect = function(options) {
|
||||
if (err) {
|
||||
winston.error(
|
||||
'error connecting to redis index ' + index,
|
||||
{ error: err.message }
|
||||
{ error: err }
|
||||
);
|
||||
process.exit(1);
|
||||
}
|
||||
|
41
package.json
41
package.json
@@ -1,52 +1,47 @@
|
||||
{
|
||||
|
||||
"name": "haste",
|
||||
"version": "0.0.1",
|
||||
|
||||
"version": "0.1.0",
|
||||
"private": true,
|
||||
|
||||
"description": "Private Paste",
|
||||
|
||||
"keywords": [ "paste", "pastebin" ],
|
||||
|
||||
"description": "Private Pastebin Server",
|
||||
"keywords": [
|
||||
"paste",
|
||||
"pastebin"
|
||||
],
|
||||
"author": {
|
||||
"name": "John Crepezzi",
|
||||
"email": "john.crepezzi@gmail.com",
|
||||
"url": "http://seejohncode.com/"
|
||||
},
|
||||
|
||||
"main": "haste",
|
||||
|
||||
"dependencies": {
|
||||
"winston": "*",
|
||||
"connect": "*",
|
||||
"uglify-js": "*"
|
||||
"winston": "0.6.2",
|
||||
"connect": "1.9.2",
|
||||
"redis-url": "0.1.0",
|
||||
"redis": "0.8.1",
|
||||
"uglify-js": "1.3.3"
|
||||
},
|
||||
|
||||
"devDependencies": {
|
||||
"mocha": "*",
|
||||
"should": "*"
|
||||
},
|
||||
|
||||
"bundledDependencies": [],
|
||||
|
||||
"engines": {
|
||||
"node": "*"
|
||||
"node": "0.8.10",
|
||||
"npm": "1.1.49"
|
||||
},
|
||||
|
||||
"bin": {
|
||||
"haste-server": "./server.js"
|
||||
},
|
||||
|
||||
"files": [ "server.js", "lib", "static" ],
|
||||
|
||||
"files": [
|
||||
"server.js",
|
||||
"lib",
|
||||
"static"
|
||||
],
|
||||
"directories": {
|
||||
"lib": "./lib"
|
||||
},
|
||||
|
||||
"scripts": {
|
||||
"start": "node server.js",
|
||||
"test": "mocha -r should spec/*"
|
||||
}
|
||||
|
||||
}
|
||||
|
38
server.js
38
server.js
@@ -8,9 +8,9 @@ var connect = require('connect');
|
||||
var DocumentHandler = require('./lib/document_handler');
|
||||
|
||||
// Load the configuration and set some defaults
|
||||
var config = JSON.parse(fs.readFileSync('config.js', 'utf8'));
|
||||
config.port = config.port || 7777;
|
||||
config.host = config.host || 'localhost';
|
||||
var config = JSON.parse(fs.readFileSync('./config.js', 'utf8'));
|
||||
config.port = process.env.PORT || config.port || 7777;
|
||||
config.host = process.env.HOST || config.host || 'localhost';
|
||||
|
||||
// Set up the logger
|
||||
if (config.logging) {
|
||||
@@ -34,8 +34,18 @@ if (!config.storage) {
|
||||
if (!config.storage.type) {
|
||||
config.storage.type = 'file';
|
||||
}
|
||||
var Store = require('./lib/document_stores/' + config.storage.type);
|
||||
var preferredStore = new Store(config.storage);
|
||||
|
||||
var Store, preferredStore;
|
||||
|
||||
if (process.env.REDISTOGO_URL) {
|
||||
var redisClient = require('redis-url').connect(process.env.REDISTOGO_URL);
|
||||
Store = require('./lib/document_stores/redis');
|
||||
preferredStore = new Store(config.storage, redisClient);
|
||||
}
|
||||
else {
|
||||
Store = require('./lib/document_stores/' + config.storage.type);
|
||||
preferredStore = new Store(config.storage);
|
||||
}
|
||||
|
||||
// Compress the static javascript assets
|
||||
if (config.recompressStaticAssets) {
|
||||
@@ -60,21 +70,19 @@ if (config.recompressStaticAssets) {
|
||||
}
|
||||
|
||||
// Send the static documents into the preferred store, skipping expirations
|
||||
var path, data;
|
||||
for (var name in config.documents) {
|
||||
var path = config.documents[name];
|
||||
fs.readFile(path, 'utf8', function(err, data) {
|
||||
if (data && !err) {
|
||||
path = config.documents[name];
|
||||
data = fs.readFileSync(path, 'utf8');
|
||||
winston.info('loading static document', { name: name, path: path });
|
||||
if (data) {
|
||||
preferredStore.set(name, data, function(cb) {
|
||||
winston.info('loaded static document', { name: name, path: path });
|
||||
winston.debug('loaded static document', { success: cb });
|
||||
}, true);
|
||||
}
|
||||
else {
|
||||
winston.warn(
|
||||
'failed to load static document',
|
||||
{ name: name, path: path }
|
||||
);
|
||||
winston.warn('failed to load static document', { name: name, path: path });
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// Pick up a key generator
|
||||
@@ -108,8 +116,10 @@ connect.createServer(
|
||||
// get documents
|
||||
app.get('/documents/:id', function(request, response, next) {
|
||||
var skipExpire = !!config.documents[request.params.id];
|
||||
var parsedUrl = url.parse(request.url, true);
|
||||
return documentHandler.handleGet(
|
||||
request.params.id,
|
||||
parsedUrl.query.callback,
|
||||
response,
|
||||
skipExpire
|
||||
);
|
||||
|
@@ -42,6 +42,7 @@ textarea {
|
||||
border: 0px;
|
||||
outline: none;
|
||||
font-size: 13px;
|
||||
padding-right: 360px;
|
||||
}
|
||||
|
||||
#box code {
|
||||
|
@@ -62,6 +62,7 @@ haste_document.prototype.save = function(data, callback) {
|
||||
type: 'post',
|
||||
data: data,
|
||||
dataType: 'json',
|
||||
contentType: 'application/json; charset=utf-8',
|
||||
success: function(res) {
|
||||
_this.locked = true;
|
||||
_this.key = res.key;
|
||||
@@ -167,7 +168,7 @@ haste.extensionMap = {
|
||||
lua: 'lua', pas: 'delphi', java: 'java', cpp: 'cpp', cc: 'cpp', m: 'objectivec',
|
||||
vala: 'vala', cs: 'cs', sql: 'sql', sm: 'smalltalk', lisp: 'lisp', ini: 'ini',
|
||||
diff: 'diff', bash: 'bash', sh: 'bash', tex: 'tex', erl: 'erlang', hs: 'haskell',
|
||||
md: 'markdown', txt: '', coffee: 'coffee'
|
||||
md: 'markdown', txt: '', coffee: 'coffee', json: 'javascript'
|
||||
};
|
||||
|
||||
// Look up the extension preferred for a type
|
||||
@@ -307,9 +308,9 @@ haste.prototype.configureButtons = function() {
|
||||
$where: $('#box2 .twitter'),
|
||||
label: 'Twitter',
|
||||
shortcut: function(evt) {
|
||||
return _this.options.twitter && _this.doc.locked && evt.ctrlKey && evt.keyCode == 84;
|
||||
return _this.options.twitter && _this.doc.locked && evt.shiftKey && evt.ctrlKey && evt.keyCode == 84;
|
||||
},
|
||||
shortcutDescription: 'control + t',
|
||||
shortcutDescription: 'control + shift + t',
|
||||
action: function() {
|
||||
window.open('https://twitter.com/share?url=' + encodeURI(window.location.href));
|
||||
}
|
||||
|
2
static/application.min.js
vendored
2
static/application.min.js
vendored
File diff suppressed because one or more lines are too long
@@ -7,7 +7,7 @@
|
||||
<link rel="stylesheet" type="text/css" href="solarized_dark.css"/>
|
||||
<link rel="stylesheet" type="text/css" href="application.css"/>
|
||||
|
||||
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.0/jquery.min.js"></script>
|
||||
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script>
|
||||
<script type="text/javascript" src="highlight.min.js"></script>
|
||||
<script type="text/javascript" src="application.min.js"></script>
|
||||
|
||||
|
@@ -17,6 +17,8 @@ pre .lisp .string,
|
||||
pre .javadoc {
|
||||
color: #586e75;
|
||||
font-style: italic;
|
||||
display: inline-block;
|
||||
line-height: 1em;
|
||||
}
|
||||
|
||||
pre .keyword,
|
||||
|
Reference in New Issue
Block a user