Compare commits
41 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
4ce752db58 | ||
|
|
68a50963f9 | ||
|
|
5258569044 | ||
|
|
04d8055d56 | ||
|
|
68b6d54f60 | ||
|
|
a950a1e44b | ||
|
|
22f5472dbe | ||
|
|
d6d37a623d | ||
|
|
757184fbc8 | ||
|
|
043fa2c32a | ||
|
|
f94f5ca714 | ||
|
|
788bfc68bc | ||
|
|
dacc39c1d9 | ||
|
|
3fb2228031 | ||
|
|
4535178fa9 | ||
|
|
42e9e1603f | ||
|
|
9a0c3c6c62 | ||
|
|
ba864a62bf | ||
|
|
6dbfe18f58 | ||
|
|
d8c65ff1f3 | ||
|
|
426990f94e | ||
|
|
6d57929e89 | ||
|
|
2b51171592 | ||
|
|
701c9ffa5f | ||
|
|
4260b1c2b6 | ||
|
|
5e926f658d | ||
|
|
78e13bb1d3 | ||
|
|
9e5ec3406d | ||
|
|
21804d277b | ||
|
|
95d1a6b35c | ||
|
|
78395d48b4 | ||
|
|
c6795f201f | ||
|
|
8e7a362bc2 | ||
|
|
7ff3e9d017 | ||
|
|
902b0bb638 | ||
|
|
8097352a6c | ||
|
|
ecf902b73e | ||
|
|
bb0ace7e23 | ||
|
|
d964b11b8c | ||
|
|
53fa67f3bf | ||
|
|
adf7ece3e9 |
@@ -3,6 +3,7 @@ language: node_js
|
||||
node_js:
|
||||
- '2'
|
||||
- '4'
|
||||
- '5'
|
||||
addons:
|
||||
- postgresql: '9.3'
|
||||
script: 'make test-travis-all'
|
||||
|
||||
26
History.md
26
History.md
@@ -1,4 +1,30 @@
|
||||
|
||||
2.5.1 / 2015-12-02
|
||||
==================
|
||||
|
||||
* chore(package): update bluebird to version 3.0.6
|
||||
* fix: SequelizeDatabaseError
|
||||
* fix(dist_tag): disable delete latest tag
|
||||
* feat: count total private pkgs
|
||||
* fix: use isoweek. a week start from monday
|
||||
* chore(package): update xss to version 0.2.8
|
||||
* chore(package): update semver to version 5.1.0
|
||||
|
||||
2.5.0 / 2015-11-17
|
||||
==================
|
||||
|
||||
* test: add node v5
|
||||
* feat(sync): sync deleted user
|
||||
* Update show.js
|
||||
* chore(package): update bytes to version 2.2.0
|
||||
* do not sync inner username
|
||||
* gzip static file
|
||||
* chore(package): update bytes to version 2.1.0
|
||||
* chore(package): update is-type-of to version 1.0.0
|
||||
* Update static.js
|
||||
* chore(package): update cfork to version 1.4.0
|
||||
* chore(package): update bluebird to version 3.0.5
|
||||
|
||||
2.4.1 / 2015-10-27
|
||||
==================
|
||||
|
||||
|
||||
@@ -1,11 +1,9 @@
|
||||
/**!
|
||||
* cnpmjs.org - controllers/registry/package/dist_tag.js
|
||||
*
|
||||
* Copyright(c) fengmk2 and other contributors.
|
||||
* Copyright(c) cnpm and other contributors.
|
||||
* MIT Licensed
|
||||
*
|
||||
* Authors:
|
||||
* fengmk2 <fengmk2@gmail.com> (http://fengmk2.github.com)
|
||||
* fengmk2 <fengmk2@gmail.com> (http://fengmk2.com)
|
||||
*/
|
||||
|
||||
'use strict';
|
||||
@@ -25,7 +23,7 @@ function ok() {
|
||||
// GET /-/package/:pkg/dist-tags -- returns the package's dist-tags
|
||||
exports.index = function* () {
|
||||
var name = this.params.name || this.params[0];
|
||||
var rows = yield* packageService.listModuleTags(name);
|
||||
var rows = yield packageService.listModuleTags(name);
|
||||
var tags = {};
|
||||
for (var i = 0; i < rows.length; i++) {
|
||||
var row = rows[i];
|
||||
@@ -79,6 +77,14 @@ exports.set = function* () {
|
||||
exports.destroy = function* () {
|
||||
var name = this.params.name || this.params[0];
|
||||
var tag = this.params.tag || this.params[1];
|
||||
if (tag === 'latest') {
|
||||
this.status = 400;
|
||||
this.body = {
|
||||
error: 'dist_tag_error',
|
||||
reason: 'Can\'t not delete latest tag',
|
||||
};
|
||||
return;
|
||||
}
|
||||
yield packageService.removeModuleTagsByNames(name, tag);
|
||||
this.body = ok();
|
||||
};
|
||||
|
||||
@@ -42,10 +42,15 @@ exports.list = function* () {
|
||||
}
|
||||
|
||||
var data = yield tasks;
|
||||
for (var k in data) {
|
||||
if (data[k].length === 0) {
|
||||
data[k] = undefined;
|
||||
|
||||
var keys = Object.keys(data);
|
||||
for (var k = 0; k < keys.length; k++) {
|
||||
var key = keys[k];
|
||||
// make empty object as undefined
|
||||
if (data[key].length === 0) {
|
||||
data[key] = undefined;
|
||||
}
|
||||
}
|
||||
|
||||
this.body = data;
|
||||
};
|
||||
|
||||
@@ -60,8 +60,13 @@ exports.sync = function* () {
|
||||
};
|
||||
|
||||
exports.getSyncLog = function* (next) {
|
||||
var logId = this.params.id || this.params[1];
|
||||
var logId = Number(this.params.id || this.params[1]);
|
||||
var offset = Number(this.query.offset) || 0;
|
||||
|
||||
if (!logId) { // NaN
|
||||
this.status = 404;
|
||||
return;
|
||||
}
|
||||
var row = yield* Log.get(logId);
|
||||
if (!row) {
|
||||
return yield* next;
|
||||
|
||||
@@ -13,7 +13,7 @@
|
||||
* Module dependencies.
|
||||
*/
|
||||
|
||||
var debug = require('debug')('cnpmjs.org:proxy:sync_module_worker');
|
||||
var debug = require('debug')('cnpmjs.org:sync_module_worker');
|
||||
var co = require('co');
|
||||
var gather = require('co-gather');
|
||||
var defer = require('co-defer');
|
||||
@@ -383,11 +383,21 @@ function* _listStarUsers(modName) {
|
||||
}
|
||||
|
||||
function* _saveNpmUser(username) {
|
||||
var user = yield* npmSerivce.getUser(username);
|
||||
var user = yield npmSerivce.getUser(username);
|
||||
if (!user) {
|
||||
return;
|
||||
var existsUser = yield User.findByName(username);
|
||||
if (existsUser && existsUser.isNpmUser) {
|
||||
// delete it
|
||||
yield User.destroy({
|
||||
where: {
|
||||
name: username,
|
||||
}
|
||||
});
|
||||
return { exists: true, deleted: true, isNpmUser: true };
|
||||
}
|
||||
return { exists: false };
|
||||
}
|
||||
yield* User.saveNpmUser(user);
|
||||
yield User.saveNpmUser(user);
|
||||
return user;
|
||||
}
|
||||
|
||||
@@ -677,7 +687,7 @@ SyncModuleWorker.prototype._sync = function* (name, pkg) {
|
||||
that.log(' [%s] %d versions: %j need to deleted',
|
||||
name, deletedVersionNames.length, deletedVersionNames);
|
||||
try {
|
||||
yield* packageService.removeModulesByNameAndVersions(name, deletedVersionNames);
|
||||
yield packageService.removeModulesByNameAndVersions(name, deletedVersionNames);
|
||||
} catch (err) {
|
||||
that.log(' [%s] delete error, %s: %s', name, err.name, err.message);
|
||||
}
|
||||
@@ -1049,7 +1059,7 @@ SyncModuleWorker.prototype._syncOneVersion = function *(versionIndex, sourcePack
|
||||
|
||||
SyncModuleWorker.sync = function* (name, username, options) {
|
||||
options = options || {};
|
||||
var result = yield* logService.create({name: name, username: username});
|
||||
var result = yield logService.create({name: name, username: username});
|
||||
var worker = new SyncModuleWorker({
|
||||
logId: result.id,
|
||||
type: options.type,
|
||||
|
||||
@@ -56,11 +56,11 @@ exports.getDownloadTotal = function* (name) {
|
||||
var end = moment();
|
||||
var start = end.clone().subtract(1, 'months').startOf('month');
|
||||
var lastday = end.clone().subtract(1, 'days').format('YYYY-MM-DD');
|
||||
var lastweekStart = end.clone().subtract(1, 'weeks').startOf('week');
|
||||
var lastweekEnd = lastweekStart.clone().endOf('week').format('YYYY-MM-DD');
|
||||
var lastweekStart = end.clone().subtract(1, 'weeks').startOf('isoweek');
|
||||
var lastweekEnd = lastweekStart.clone().endOf('isoweek').format('YYYY-MM-DD');
|
||||
var lastmonthEnd = start.clone().endOf('month').format('YYYY-MM-DD');
|
||||
var thismonthStart = end.clone().startOf('month').format('YYYY-MM-DD');
|
||||
var thisweekStart = end.clone().startOf('week').format('YYYY-MM-DD');
|
||||
var thisweekStart = end.clone().startOf('isoweek').format('YYYY-MM-DD');
|
||||
start = start.format('YYYY-MM-DD');
|
||||
end = end.format('YYYY-MM-DD');
|
||||
lastweekStart = lastweekStart.format('YYYY-MM-DD');
|
||||
|
||||
@@ -37,7 +37,8 @@ module.exports = function* showUser(next) {
|
||||
var data = {
|
||||
name: name,
|
||||
email: user.email,
|
||||
json: user.json || {}
|
||||
json: user.json || {},
|
||||
isNpmUser: user.isNpmUser,
|
||||
};
|
||||
|
||||
if (data.json.login) {
|
||||
|
||||
@@ -1,11 +1,9 @@
|
||||
/**!
|
||||
* cnpmjs.org - middleware/exists_package.js
|
||||
*
|
||||
* Copyright(c) fengmk2 and other contributors.
|
||||
* MIT Licensed
|
||||
*
|
||||
* Authors:
|
||||
* fengmk2 <fengmk2@gmail.com> (http://fengmk2.github.com)
|
||||
* fengmk2 <fengmk2@gmail.com> (http://fengmk2.com)
|
||||
*/
|
||||
|
||||
'use strict';
|
||||
|
||||
@@ -23,7 +23,8 @@ var staticDir = path.join(path.dirname(__dirname), 'public');
|
||||
module.exports = middlewares.staticCache(staticDir, {
|
||||
buffer: config.debug ? false : true,
|
||||
maxAge: config.debug ? 0 : 60 * 60 * 24 * 7,
|
||||
alas: {
|
||||
alias: {
|
||||
'/favicon.ico': '/favicon.png'
|
||||
}
|
||||
},
|
||||
gzip: config.enableCompress,
|
||||
});
|
||||
|
||||
19
package.json
19
package.json
@@ -1,10 +1,10 @@
|
||||
{
|
||||
"name": "cnpmjs.org",
|
||||
"version": "2.4.1",
|
||||
"version": "2.5.1",
|
||||
"description": "Private npm registry and web for Enterprise, base on MySQL and Simple Store Service",
|
||||
"main": "index.js",
|
||||
"scripts": {
|
||||
"test": "make install && make jshint && make test",
|
||||
"test": "make jshint && make test",
|
||||
"start": "./bin/nodejsctl start && cp History.md docs/web/history.md",
|
||||
"status": "./bin/nodejsctl status",
|
||||
"stop": "./bin/nodejsctl stop"
|
||||
@@ -14,9 +14,9 @@
|
||||
},
|
||||
"dependencies": {
|
||||
"agentkeepalive": "~1.2.0",
|
||||
"bluebird": "~2.10.2",
|
||||
"bytes": "~1.0.0",
|
||||
"cfork": "~1.3.1",
|
||||
"bluebird": "~3.0.6",
|
||||
"bytes": "~2.2.0",
|
||||
"cfork": "~1.4.0",
|
||||
"co": "~4.6.0",
|
||||
"co-defer": "~1.0.0",
|
||||
"co-gather": "~0.0.1",
|
||||
@@ -31,7 +31,7 @@
|
||||
"gravatar": "~1.1.0",
|
||||
"humanize-ms": "~1.0.1",
|
||||
"humanize-number": "~0.0.2",
|
||||
"is-type-of": "~0.3.1",
|
||||
"is-type-of": "~1.0.0",
|
||||
"kcors": "~1.0.1",
|
||||
"koa": "~1.1.0",
|
||||
"koa-limit": "~1.0.2",
|
||||
@@ -39,6 +39,7 @@
|
||||
"koa-middlewares": "~2.1.0",
|
||||
"koa-mock": "~1.5.0",
|
||||
"koa-safe-jsonp": "~0.3.0",
|
||||
"lodash": "^3.10.1",
|
||||
"markdown-it": "~3.0.6",
|
||||
"mime": "~1.3.4",
|
||||
"mini-logger": "~1.0.0",
|
||||
@@ -46,14 +47,14 @@
|
||||
"moment": "~2.10.6",
|
||||
"mysql": "~2.5.4",
|
||||
"nodemailer": "~1.3.0",
|
||||
"semver": "~5.0.3",
|
||||
"semver": "~5.1.0",
|
||||
"sequelize": "~2.0.1",
|
||||
"thunkify-wrap": "~1.0.4",
|
||||
"treekill": "~1.0.0",
|
||||
"tunnel-agent": "^0.4.0",
|
||||
"urllib": "~2.5.0",
|
||||
"utility": "~1.5.0",
|
||||
"xss": "~0.1.20"
|
||||
"utility": "~1.6.0",
|
||||
"xss": "~0.2.8"
|
||||
},
|
||||
"devDependencies": {
|
||||
"autod": "*",
|
||||
|
||||
@@ -50,5 +50,5 @@ exports.append = function* (id, log) {
|
||||
};
|
||||
|
||||
exports.get = function* (id) {
|
||||
return yield ModuleLog.find(Number(id));
|
||||
return yield ModuleLog.find(id);
|
||||
};
|
||||
|
||||
@@ -12,6 +12,8 @@
|
||||
* Module dependencies.
|
||||
*/
|
||||
|
||||
var _ = require('lodash');
|
||||
|
||||
var models = require('../models');
|
||||
var common = require('./common');
|
||||
var Tag = models.Tag;
|
||||
@@ -25,7 +27,6 @@ var ModuleUnpublished = models.ModuleUnpublished;
|
||||
var NpmModuleMaintainer = models.NpmModuleMaintainer;
|
||||
|
||||
// module
|
||||
|
||||
var _parseRow = function (row) {
|
||||
if (row.package.indexOf('%7B%22') === 0) {
|
||||
// now store package will encodeURIComponent() after JSON.stringify
|
||||
@@ -220,11 +221,11 @@ exports.listPublicModuleNamesSince = function* (start) {
|
||||
exports.listAllPublicModuleNames = function* () {
|
||||
var sql = 'SELECT DISTINCT(name) AS name FROM tag ORDER BY name';
|
||||
var rows = yield models.query(sql);
|
||||
return rows.filter(function (row) {
|
||||
return _.chain(rows).filter(function (row) {
|
||||
return !common.isPrivatePackage(row.name);
|
||||
}).map(function (row) {
|
||||
return row.name;
|
||||
});
|
||||
}).value();
|
||||
};
|
||||
|
||||
exports.listModulesByName = function* (moduleName) {
|
||||
@@ -234,10 +235,10 @@ exports.listModulesByName = function* (moduleName) {
|
||||
},
|
||||
order: [ ['id', 'DESC'] ]
|
||||
});
|
||||
return mods.map(function (mod) {
|
||||
return _.chain(mods).map(function (mod) {
|
||||
parseRow(mod);
|
||||
return mod;
|
||||
});
|
||||
}).value();
|
||||
};
|
||||
|
||||
exports.getModuleLastModified = function* (name) {
|
||||
|
||||
@@ -170,6 +170,18 @@ describe('controllers/registry/package/dist_tag.test.js', function () {
|
||||
});
|
||||
});
|
||||
|
||||
it('should not destroy latest tag', function(done) {
|
||||
request(app.listen())
|
||||
.delete('/-/package/@cnpmtest/dist_tag_test_module_destroy/dist-tags/latest')
|
||||
.set('authorization', utils.otherUserAuth)
|
||||
.set('content-type', 'application/json')
|
||||
.expect({
|
||||
error: 'dist_tag_error',
|
||||
reason: 'Can\'t not delete latest tag',
|
||||
})
|
||||
.expect(400, done);
|
||||
});
|
||||
|
||||
it('should 404 destroy not exists tag', function (done) {
|
||||
request(app.listen())
|
||||
.delete('/-/package/@cnpmtest/dist_tag_test_module_destroy/dist-tags/not-exists')
|
||||
|
||||
@@ -123,6 +123,12 @@ describe('controllers/sync.test.js', function () {
|
||||
.get('/sync/pedding/log/123123123')
|
||||
.expect(404, done);
|
||||
});
|
||||
|
||||
it('should 404 when log id not number', function (done) {
|
||||
request(webApp.listen())
|
||||
.get('/sync/pedding/log/info.php')
|
||||
.expect(404, done);
|
||||
});
|
||||
});
|
||||
|
||||
describe('scope package', function () {
|
||||
|
||||
@@ -1,6 +1,4 @@
|
||||
/**!
|
||||
* cnpmjs.org - test/controllers/sync_module_worker.test.js
|
||||
*
|
||||
* Copyright(c) cnpmjs.org and other contributors.
|
||||
* MIT Licensed
|
||||
*
|
||||
@@ -14,6 +12,7 @@
|
||||
* Module dependencies.
|
||||
*/
|
||||
|
||||
var should = require('should');
|
||||
var mm = require('mm');
|
||||
var thunkify = require('thunkify-wrap');
|
||||
var request = require('supertest');
|
||||
@@ -24,6 +23,7 @@ var logService = require('../../services/module_log');
|
||||
var packageService = require('../../services/package');
|
||||
var utils = require('../utils');
|
||||
var app = require('../../servers/registry');
|
||||
var User = require('../../models').User;
|
||||
|
||||
describe('test/controllers/sync_module_worker.test.js', function () {
|
||||
afterEach(mm.restore);
|
||||
@@ -299,5 +299,64 @@ describe('test/controllers/sync_module_worker.test.js', function () {
|
||||
var end = thunkify.event(worker, 'end');
|
||||
yield end();
|
||||
});
|
||||
|
||||
describe('sync deleted user', function() {
|
||||
before(function*() {
|
||||
var user = {
|
||||
name: 'notexistsuserscnpmtest',
|
||||
email: 'notexistsuserscnpmtest@gmail.com',
|
||||
};
|
||||
yield User.saveNpmUser(user);
|
||||
|
||||
var user = {
|
||||
name: 'existsuserscnpmtest',
|
||||
email: 'existsuserscnpmtest@gmail.com',
|
||||
password_sha: '0',
|
||||
salt: '0',
|
||||
ip: '127.0.0.1',
|
||||
};
|
||||
yield User.add(user);
|
||||
});
|
||||
|
||||
it('should not delete when cnpm user exists', function*() {
|
||||
var worker = new SyncModuleWorker({
|
||||
type: 'user',
|
||||
name: 'existsuserscnpmtest',
|
||||
username: 'fengmk2',
|
||||
});
|
||||
worker.start();
|
||||
var end = thunkify.event(worker, 'end');
|
||||
yield end();
|
||||
var user = yield User.findByName('existsuserscnpmtest');
|
||||
should.exists(user);
|
||||
user.name.should.equal('existsuserscnpmtest');
|
||||
});
|
||||
|
||||
it('should delete when user exists', function*() {
|
||||
var worker = new SyncModuleWorker({
|
||||
type: 'user',
|
||||
name: 'notexistsuserscnpmtest',
|
||||
username: 'fengmk2',
|
||||
});
|
||||
worker.start();
|
||||
var end = thunkify.event(worker, 'end');
|
||||
yield end();
|
||||
var user = yield User.findByName('notexistsuserscnpmtest');
|
||||
should.not.exists(user);
|
||||
});
|
||||
|
||||
it('should not delete when user not exists', function*() {
|
||||
var worker = new SyncModuleWorker({
|
||||
type: 'user',
|
||||
name: 'notexistsuserscnpmtest',
|
||||
username: 'fengmk2',
|
||||
});
|
||||
worker.start();
|
||||
var end = thunkify.event(worker, 'end');
|
||||
yield end();
|
||||
var user = yield User.findByName('notexistsuserscnpmtest');
|
||||
should.not.exists(user);
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
@@ -15,7 +15,7 @@
|
||||
var packages = scopes[scope];
|
||||
%>
|
||||
<h1>
|
||||
Private packages in <%= scope %>
|
||||
Private packages in <%= scope %>(total: <%= packages.length %>)
|
||||
</h1>
|
||||
<hr />
|
||||
<% if (!packages.length) { %>
|
||||
|
||||
@@ -20,8 +20,9 @@
|
||||
<small>(<%= user.json.fullname %>)</small>
|
||||
<% } %>
|
||||
|
||||
|
||||
<small>[<a href="/sync/user:<%= user.name %>" target="_blank">SYNC</a> profile]</small>
|
||||
<% if (user.isNpmUser) { %>
|
||||
<small>[<a href="/sync/user:<%= user.name %>" target="_blank">SYNC</a> profile]</small>
|
||||
<% } %>
|
||||
</h2>
|
||||
<div class="ant-table">
|
||||
<table class="downloads">
|
||||
|
||||
Reference in New Issue
Block a user