keybase-proofs
Version:
Publicly-verifiable proofs of identity
833 lines (657 loc) • 23.1 kB
JavaScript
// Generated by IcedCoffeeScript 108.0.11
(function() {
var Base, CoinbaseBinding, DnsBinding, FacebookBinding, GenericSocialBinding, GenericWebSiteBinding, GithubBinding, HackerNewsBinding, KeybaseBinding, RedditBinding, SocialNetworkBinding, TwitterBinding, WebServiceBinding, cieq, constants, has_non_ascii, iced, urlmod, __iced_k, __iced_k_noop, _ref,
__hasProp = {}.hasOwnProperty,
__extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; };
iced = require('iced-runtime');
__iced_k = __iced_k_noop = function() {};
_ref = require('./base'), cieq = _ref.cieq, Base = _ref.Base;
constants = require('./constants').constants;
urlmod = require('url');
WebServiceBinding = (function(_super) {
__extends(WebServiceBinding, _super);
function WebServiceBinding() {
return WebServiceBinding.__super__.constructor.apply(this, arguments);
}
WebServiceBinding.prototype._v_customize_json = function(ret) {
var o;
if ((o = this.service_obj()) != null) {
return ret.body.service = o;
}
};
WebServiceBinding.prototype._service_obj_check = function(x) {
return !(x != null);
};
WebServiceBinding.prototype._optional_sections = function() {
return WebServiceBinding.__super__._optional_sections.call(this).concat(["revoke", "service"]);
};
WebServiceBinding.prototype.resource_id = function() {
return "";
};
WebServiceBinding.prototype._type = function() {
return constants.sig_types.web_service_binding;
};
WebServiceBinding.prototype._type_v2 = function(revoke_flag) {
if ((this.revoke != null) || revoke_flag) {
return constants.sig_types_v2.web_service_binding_with_revoke;
} else {
return constants.sig_types_v2.web_service_binding;
}
};
WebServiceBinding.prototype._v_check = function(_arg, cb) {
var err, json, ___iced_passed_deferral, __iced_deferrals, __iced_k;
__iced_k = __iced_k_noop;
___iced_passed_deferral = iced.findDeferral(arguments);
json = _arg.json;
(function(_this) {
return (function(__iced_k) {
__iced_deferrals = new iced.Deferrals(__iced_k, {
parent: ___iced_passed_deferral,
filename: "/Users/max/src/keybase/proofs/src/web_service.iced",
funcname: "WebServiceBinding._v_check"
});
WebServiceBinding.__super__._v_check.call(_this, {
json: json
}, __iced_deferrals.defer({
assign_fn: (function() {
return function() {
return err = arguments[0];
};
})(),
lineno: 44
}));
__iced_deferrals._fulfill();
});
})(this)((function(_this) {
return function() {
var _ref1;
if (!(typeof err !== "undefined" && err !== null) && !(_this._service_obj_check(json != null ? (_ref1 = json.body) != null ? _ref1.service : void 0 : void 0))) {
err = new Error("Bad service object found");
}
return cb(err);
};
})(this));
};
return WebServiceBinding;
})(Base);
SocialNetworkBinding = (function(_super) {
__extends(SocialNetworkBinding, _super);
function SocialNetworkBinding() {
return SocialNetworkBinding.__super__.constructor.apply(this, arguments);
}
SocialNetworkBinding.prototype._service_obj_check = function(x) {
var so;
so = this.service_obj();
return (x != null) && cieq(so.username, x.username) && cieq(so.name, x.name);
};
SocialNetworkBinding.prototype.service_obj = function() {
return {
name: this.service_name(),
username: this.user.remote
};
};
SocialNetworkBinding.prototype.is_remote_proof = function() {
return true;
};
SocialNetworkBinding.single_occupancy = function() {
return true;
};
SocialNetworkBinding.prototype.single_occupancy = function() {
return SocialNetworkBinding.single_occupancy();
};
SocialNetworkBinding.normalize_name = function(n) {
n = n.toLowerCase();
if (n[0] === '@') {
return n.slice(1);
} else {
return n;
}
};
SocialNetworkBinding.prototype.normalize_name = function(n) {
n || (n = this.user.remote);
if (this.check_name(n)) {
return SocialNetworkBinding.normalize_name(n);
} else {
return null;
}
};
SocialNetworkBinding.prototype.check_inputs = function() {
if (this.check_name(this.user.remote)) {
return null;
} else {
return new Error("Bad remote_username given: " + this.user.remote);
}
};
SocialNetworkBinding.prototype.to_key_value_pair = function() {
return {
key: this.service_name(),
value: this.normalize_name()
};
};
return SocialNetworkBinding;
})(WebServiceBinding);
has_non_ascii = function(s) {
var buf, i, _i, _ref1;
buf = Buffer.from(s, 'utf8');
for (i = _i = 0, _ref1 = buf.length; 0 <= _ref1 ? _i < _ref1 : _i > _ref1; i = 0 <= _ref1 ? ++_i : --_i) {
if (buf.readUInt8(i) >= 128) {
return true;
}
}
return false;
};
GenericWebSiteBinding = (function(_super) {
__extends(GenericWebSiteBinding, _super);
function GenericWebSiteBinding(args) {
this.remote_host = this.parse(args.remote_host);
GenericWebSiteBinding.__super__.constructor.call(this, args);
}
GenericWebSiteBinding.parse = function(h, opts) {
var n, o, protocol, ret;
if (opts == null) {
opts = {};
}
ret = null;
if ((h != null) && ((h = h.toLowerCase()) != null) && ((o = urlmod.parse(h)) != null) && (o.hostname != null) && (!(o.path != null) || (o.path === '/')) && !(o.port != null)) {
protocol = o.protocol || opts.protocol;
if (protocol != null) {
ret = {
protocol: protocol,
hostname: o.hostname
};
n = GenericWebSiteBinding.to_string(ret);
if (has_non_ascii(n)) {
console.error("Bug in urlmod found: found non-ascii in URL: " + n);
ret = null;
}
}
}
return ret;
};
GenericWebSiteBinding.prototype.parse = function(h) {
return GenericWebSiteBinding.parse(h);
};
GenericWebSiteBinding.prototype.to_key_value_pair = function() {
return {
key: this.remote_host.protocol.slice(0, -1),
value: this.remote_host.hostname
};
};
GenericWebSiteBinding.to_string = function(o) {
return ([o.protocol, o.hostname].join('//')).toLowerCase();
};
GenericWebSiteBinding.normalize_name = function(s) {
var o;
if ((o = GenericWebSiteBinding.parse(s)) != null) {
return GenericWebSiteBinding.to_string(o);
} else {
return null;
}
};
GenericWebSiteBinding.check_name = function(h) {
return GenericWebSiteBinding.parse(h) != null;
};
GenericWebSiteBinding.prototype.check_name = function(n) {
return this.parse(n) != null;
};
GenericWebSiteBinding.single_occupancy = function() {
return false;
};
GenericWebSiteBinding.prototype.single_occupancy = function() {
return GenericWebSiteBinding.single_occupancy();
};
GenericWebSiteBinding.prototype.resource_id = function() {
return this.to_string();
};
GenericWebSiteBinding.prototype.to_string = function() {
return GenericWebSiteBinding.to_string(this.remote_host);
};
GenericWebSiteBinding.prototype._service_obj_check = function(x) {
var so;
so = this.service_obj();
return (x != null) && (so != null) && cieq(so.protocol, x.protocol) && cieq(so.hostname, x.hostname);
};
GenericWebSiteBinding.prototype.service_obj = function() {
return this.remote_host;
};
GenericWebSiteBinding.prototype.is_remote_proof = function() {
return true;
};
GenericWebSiteBinding.prototype.proof_type = function() {
return constants.proof_types.generic_web_site;
};
GenericWebSiteBinding.name_hint = function() {
return "a valid hostname, like `my.site.com`";
};
GenericWebSiteBinding.prototype.check_inputs = function() {
if (this.remote_host != null) {
return null;
} else {
return new Error("Bad remote_host given");
}
};
GenericWebSiteBinding.prototype.check_existing = function(proofs) {
var check_data_json, v, _i, _len;
if ((v = proofs.generic_web_site) != null) {
for (_i = 0, _len = v.length; _i < _len; _i++) {
check_data_json = v[_i].check_data_json;
if (cieq(GenericWebSiteBinding.to_string(check_data_json), this.to_string())) {
return new Error("A live proof for " + (this.to_string()) + " already exists");
}
}
}
return null;
};
return GenericWebSiteBinding;
})(WebServiceBinding);
DnsBinding = (function(_super) {
__extends(DnsBinding, _super);
function DnsBinding(args) {
this.domain = this.parse(args.remote_host);
DnsBinding.__super__.constructor.call(this, args);
}
DnsBinding.parse = function(h, opts) {
var o, ret;
if (opts == null) {
opts = {};
}
ret = null;
if (h != null) {
if (h.indexOf("dns://") !== 0) {
h = "dns://" + h;
}
if ((h != null) && ((h = h.toLowerCase()) != null) && ((o = urlmod.parse(h)) != null) && (o.hostname != null) && (!(o.path != null) || (o.path === '/')) && !(o.port != null)) {
ret = o.hostname;
if (has_non_ascii(ret)) {
console.error("Bug in urlmod found: non-ASCII in done name: " + ret);
ret = null;
}
}
}
return ret;
};
DnsBinding.prototype.to_key_value_pair = function() {
return {
key: "dns",
value: this.domain
};
};
DnsBinding.prototype.parse = function(h) {
return DnsBinding.parse(h);
};
DnsBinding.to_string = function(o) {
return o.domain;
};
DnsBinding.prototype.to_string = function() {
return this.domain;
};
DnsBinding.prototype.normalize_name = function(s) {
return DnsBinding.parse(s);
};
DnsBinding.single_occupancy = function() {
return false;
};
DnsBinding.prototype.single_occupancy = function() {
return DnsBinding.single_occupancy();
};
DnsBinding.prototype.resource_id = function() {
return this.to_string();
};
DnsBinding.prototype._service_obj_check = function(x) {
var so;
so = this.service_obj();
return (x != null) && (so != null) && cieq(so.protocol, x.protocol) && cieq(so.domain, x.domain);
};
DnsBinding.service_name = function() {
return "dns";
};
DnsBinding.prototype.service_name = function() {
return this.constructor.service_name();
};
DnsBinding.prototype.proof_type = function() {
return constants.proof_types.dns;
};
DnsBinding.check_name = function(n) {
return DnsBinding.parse(n) != null;
};
DnsBinding.prototype.check_name = function(n) {
return DnsBinding.check_name(n);
};
DnsBinding.prototype.service_obj = function() {
return {
protocol: "dns",
domain: this.domain
};
};
DnsBinding.prototype.is_remote_proof = function() {
return true;
};
DnsBinding.prototype.check_inputs = function() {
if (this.domain) {
return null;
} else {
return new Error("Bad domain given");
}
};
DnsBinding.name_hint = function() {
return "A DNS domain name, like maxk.org";
};
DnsBinding.prototype.check_existing = function(proofs) {
var check_data_json, v, _i, _len;
if ((v = proofs.dns != null)) {
for (_i = 0, _len = v.length; _i < _len; _i++) {
check_data_json = v[_i].check_data_json;
if (cieq(GenericWebSiteBinding.to_string(check_data_json), this.to_string())) {
return new Error("A live proof for " + (this.to_string()) + " already exists");
}
}
}
return null;
};
return DnsBinding;
})(WebServiceBinding);
TwitterBinding = (function(_super) {
__extends(TwitterBinding, _super);
function TwitterBinding() {
return TwitterBinding.__super__.constructor.apply(this, arguments);
}
TwitterBinding.service_name = function() {
return "twitter";
};
TwitterBinding.prototype.service_name = function() {
return this.constructor.service_name();
};
TwitterBinding.prototype.proof_type = function() {
return constants.proof_types.twitter;
};
TwitterBinding.prototype.is_short = function() {
return true;
};
TwitterBinding.check_name = function(n) {
var ret;
ret = (n == null) || ((n = n.toLowerCase()) == null) ? false : n.match(/^[a-z0-9_]{1,20}$/) ? true : false;
return ret;
};
TwitterBinding.prototype.check_name = function(n) {
return TwitterBinding.check_name(n);
};
TwitterBinding.name_hint = function() {
return "alphanumerics, between 1 and 15 characters long";
};
return TwitterBinding;
})(SocialNetworkBinding);
FacebookBinding = (function(_super) {
__extends(FacebookBinding, _super);
function FacebookBinding() {
return FacebookBinding.__super__.constructor.apply(this, arguments);
}
FacebookBinding.service_name = function() {
return "facebook";
};
FacebookBinding.prototype.service_name = function() {
return this.constructor.service_name();
};
FacebookBinding.prototype.proof_type = function() {
return constants.proof_types.facebook;
};
FacebookBinding.prototype.is_short = function() {
return true;
};
FacebookBinding.check_name = function(n) {
var ret;
ret = (n == null) || ((n = n.toLowerCase()) == null) ? false : n.match(/^[a-z0-9.]{1,50}$/) ? true : false;
return ret;
};
FacebookBinding.prototype.check_name = function(n) {
return FacebookBinding.check_name(n);
};
FacebookBinding.name_hint = function() {
return "alphanumerics and dots, between 1 and 50 characters long";
};
return FacebookBinding;
})(SocialNetworkBinding);
KeybaseBinding = (function(_super) {
__extends(KeybaseBinding, _super);
function KeybaseBinding() {
return KeybaseBinding.__super__.constructor.apply(this, arguments);
}
KeybaseBinding.prototype._service_obj_check = function(x) {
return x == null;
};
KeybaseBinding.service_name = function() {
return "keybase";
};
KeybaseBinding.prototype.service_name = function() {
return this.constructor.service_name();
};
KeybaseBinding.prototype.proof_type = function() {
return constants.proof_types.keybase;
};
KeybaseBinding.prototype.service_obj = function() {
return null;
};
return KeybaseBinding;
})(WebServiceBinding);
GithubBinding = (function(_super) {
__extends(GithubBinding, _super);
function GithubBinding() {
return GithubBinding.__super__.constructor.apply(this, arguments);
}
GithubBinding.service_name = function() {
return "github";
};
GithubBinding.prototype.service_name = function() {
return this.constructor.service_name();
};
GithubBinding.prototype.proof_type = function() {
return constants.proof_types.github;
};
GithubBinding.check_name = function(n) {
if ((n == null) || ((n = n.toLowerCase()) == null)) {
return false;
} else if (n.match(/^[a-z0-9][a-z0-9-]{0,38}$/)) {
return true;
} else {
return false;
}
};
GithubBinding.name_hint = function() {
return "alphanumerics, between 1 and 39 characters long";
};
GithubBinding.prototype.check_name = function(n) {
return GithubBinding.check_name(n);
};
return GithubBinding;
})(SocialNetworkBinding);
RedditBinding = (function(_super) {
__extends(RedditBinding, _super);
function RedditBinding() {
return RedditBinding.__super__.constructor.apply(this, arguments);
}
RedditBinding.service_name = function() {
return "reddit";
};
RedditBinding.prototype.service_name = function() {
return this.constructor.service_name();
};
RedditBinding.prototype.proof_type = function() {
return constants.proof_types.reddit;
};
RedditBinding.check_name = function(n) {
if ((n == null) || ((n = n.toLowerCase()) == null)) {
return false;
} else if (n.match(/^[a-z0-9_-]{3,20}$/)) {
return true;
} else {
return false;
}
};
RedditBinding.name_hint = function() {
return "alphanumerics, between 3 and 20 characters long";
};
RedditBinding.prototype.check_name = function(n) {
return RedditBinding.check_name(n);
};
return RedditBinding;
})(SocialNetworkBinding);
CoinbaseBinding = (function(_super) {
__extends(CoinbaseBinding, _super);
function CoinbaseBinding() {
return CoinbaseBinding.__super__.constructor.apply(this, arguments);
}
CoinbaseBinding.service_name = function() {
return "coinbase";
};
CoinbaseBinding.prototype.service_name = function() {
return this.constructor.service_name();
};
CoinbaseBinding.prototype.proof_type = function() {
return constants.proof_types.coinbase;
};
CoinbaseBinding.check_name = function(n) {
if ((n == null) || ((n = n.toLowerCase()) == null)) {
return false;
} else if (n.match(/^[a-z0-9_]{2,16}$/)) {
return true;
} else {
return false;
}
};
CoinbaseBinding.name_hint = function() {
return "alphanumerics, between 2 and 16 characters long";
};
CoinbaseBinding.prototype.check_name = function(n) {
return CoinbaseBinding.check_name(n);
};
return CoinbaseBinding;
})(SocialNetworkBinding);
HackerNewsBinding = (function(_super) {
__extends(HackerNewsBinding, _super);
function HackerNewsBinding() {
return HackerNewsBinding.__super__.constructor.apply(this, arguments);
}
HackerNewsBinding.service_name = function() {
return "hackernews";
};
HackerNewsBinding.prototype.service_name = function() {
return this.constructor.service_name();
};
HackerNewsBinding.prototype.proof_type = function() {
return constants.proof_types.hackernews;
};
HackerNewsBinding.check_name = function(n) {
if ((n == null) || ((n = n.toLowerCase()) == null)) {
return false;
} else if (n.match(/^[a-z0-9_-]{2,15}$/)) {
return true;
} else {
return false;
}
};
HackerNewsBinding.name_hint = function() {
return "alphanumerics, between 2 and 15 characters long";
};
HackerNewsBinding.prototype.check_name = function(n) {
return HackerNewsBinding.check_name(n);
};
HackerNewsBinding.normalize_name = function(n) {
if (n[0] === '@') {
return n.slice(1);
} else {
return n;
}
};
HackerNewsBinding.prototype.normalize_name = function(n) {
n || (n = this.user.remote);
if (this.check_name(n)) {
return HackerNewsBinding.normalize_name(n);
} else {
return null;
}
};
HackerNewsBinding.prototype._service_obj_check = function(x) {
var so;
so = this.service_obj();
return (x != null) && (so.username === x.username) && cieq(so.name, x.name);
};
return HackerNewsBinding;
})(SocialNetworkBinding);
GenericSocialBinding = (function(_super) {
__extends(GenericSocialBinding, _super);
function GenericSocialBinding(args) {
var r;
this.remote_service = args.remote_service;
if ((r = args.name_regexp) != null) {
try {
this.name_regexp = new RegExp(r);
} catch (_error) {}
}
GenericSocialBinding.__super__.constructor.call(this, args);
}
GenericSocialBinding.single_occupancy = function() {
return false;
};
GenericSocialBinding.prototype.single_occupancy = function() {
return GenericSocialBinding.single_occupancy();
};
GenericSocialBinding.prototype.service_name = function() {
return this.remote_service;
};
GenericSocialBinding.prototype.proof_type = function() {
return constants.proof_types.generic_social;
};
GenericSocialBinding.prototype.check_name = function(n) {
if (!((n != null) && (n === n.toLowerCase()))) {
return false;
} else if (n.match(this.name_regexp)) {
return true;
} else {
return false;
}
};
GenericSocialBinding.name_hint = function() {
return "valid username";
};
GenericSocialBinding._check_remote_service = function(n) {
if (!((n != null) && (n === n.toLowerCase()))) {
return false;
} else if (n.match(/^([a-zA-Z0-9-_]+\.)*[a-zA-Z0-9][a-zA-Z0-9-_]+\.[a-zA-Z]{2,15}?$/)) {
return true;
} else {
return false;
}
};
GenericSocialBinding.prototype._check_remote_service = function(n) {
return GenericSocialBinding._check_remote_service(n);
};
GenericSocialBinding.prototype.check_inputs = function() {
var err;
if (err = GenericSocialBinding.__super__.check_inputs.call(this)) {
return err;
} else if (!(this.remote_service != null)) {
return new Error("No remote_service given");
} else if (!(this._check_remote_service(this.remote_service))) {
return new Error("invalid remote_service");
} else if (!(this.name_regexp != null)) {
return new Error("No name_regexp given");
} else {
return null;
}
};
GenericSocialBinding.prototype.resource_id = function() {
return this.remote_service;
};
return GenericSocialBinding;
})(SocialNetworkBinding);
exports.TwitterBinding = TwitterBinding;
exports.FacebookBinding = FacebookBinding;
exports.RedditBinding = RedditBinding;
exports.KeybaseBinding = KeybaseBinding;
exports.GithubBinding = GithubBinding;
exports.GenericWebSiteBinding = GenericWebSiteBinding;
exports.CoinbaseBinding = CoinbaseBinding;
exports.DnsBinding = DnsBinding;
exports.HackerNewsBinding = HackerNewsBinding;
exports.SocialNetworkBinding = SocialNetworkBinding;
exports.GenericSocialBinding = GenericSocialBinding;
}).call(this);