mirror of
https://github.com/status-im/github-oracle.git
synced 2026-08-27 09:51:10 +00:00
separated repository reg and user reg.
This commit is contained in:
@@ -0,0 +1,87 @@
|
||||
//Author: Ricardo Guilherme Schmidt <3esmit@gmail.com>
|
||||
pragma solidity ^0.4.11;
|
||||
|
||||
import "lib/ethereans/management/Owned.sol";
|
||||
|
||||
contract GitHubAPIReg is Owned, usingOraclize {
|
||||
string credentials = "";
|
||||
|
||||
event OracleEvent(bytes32 myid, string result, bytes proof);
|
||||
|
||||
function GitHubAPI(){
|
||||
oraclize_setProof(proofType_TLSNotary | proofStorage_IPFS);
|
||||
}
|
||||
|
||||
//owner management
|
||||
function setAPICredentials(string _client_id, string _client_secret) only_owner {
|
||||
credentials = strConcat("?client_id=",_client_id,"&client_secret=",_client_secret,"");
|
||||
}
|
||||
|
||||
function clearAPICredentials() only_owner {
|
||||
credentials = "";
|
||||
}
|
||||
|
||||
function getNextString(bytes _str, uint8 _pos) internal constant returns (string,uint8) {
|
||||
uint8 start = 0;
|
||||
uint8 end = 0;
|
||||
uint strl =_str.length;
|
||||
for (;strl > _pos; _pos++) {
|
||||
if (_str[_pos] == '"'){ //Found quotation mark
|
||||
if(_str[_pos-1] != '\\'){ //is not escaped
|
||||
end = start == 0 ? 0: _pos;
|
||||
start = start == 0 ? (_pos+1) : start;
|
||||
if(end > 0) break;
|
||||
}
|
||||
}
|
||||
}
|
||||
bytes memory str = new bytes(end-start);
|
||||
for(_pos=0; _pos<str.length; _pos++){
|
||||
str[_pos] = _str[start+_pos];
|
||||
}
|
||||
for(_pos=end+1; _pos<_str.length; _pos++) if (_str[_pos] == ','){ _pos++; break; } //end
|
||||
|
||||
return (string(str),_pos);
|
||||
}
|
||||
|
||||
function getNextUInt(bytes _str, uint8 _pos) internal constant returns (uint,uint8) {
|
||||
uint val = 0;
|
||||
uint strl =_str.length;
|
||||
for (; strl > _pos; _pos++) {
|
||||
byte bp = _str[_pos];
|
||||
if (bp == ','){ //Find ends
|
||||
_pos++; break;
|
||||
}else if ((bp >= 48)&&(bp <= 57)){ //only ASCII numbers
|
||||
val *= 10;
|
||||
val += uint(bp) - 48;
|
||||
}
|
||||
}
|
||||
return (val,_pos);
|
||||
}
|
||||
|
||||
function getNextAddr(bytes _str, uint8 _pos) internal constant returns (address, uint8){
|
||||
uint160 iaddr = 0;
|
||||
uint strl =_str.length;
|
||||
for(;strl > _pos; _pos++){
|
||||
byte bp = _str[_pos];
|
||||
if (bp == '0'){
|
||||
if (_str[_pos+1] == 'x'){
|
||||
for (_pos=_pos+2; _pos<2+2*20; _pos+=2){
|
||||
iaddr *= 256;
|
||||
iaddr += (uint160(hexVal(uint160(_str[_pos])))*16+uint160(hexVal(uint160(_str[_pos+1]))));
|
||||
}
|
||||
_pos++;
|
||||
break;
|
||||
}
|
||||
}else if (bp == ','){
|
||||
_pos++;
|
||||
break;
|
||||
}
|
||||
}
|
||||
return (address(iaddr),_pos);
|
||||
}
|
||||
|
||||
function hexVal(uint val) internal constant returns (uint){
|
||||
return val - (val < 58 ? 48 : (val < 97 ? 55 : 87));
|
||||
}
|
||||
|
||||
}
|
||||
@@ -7,14 +7,11 @@ import "lib/ethereans/management/Owned.sol";
|
||||
|
||||
|
||||
contract GitHubAPI{
|
||||
function register(address _sender, string _github_user, string _gistid) payable;
|
||||
function updateCommits(string _full_name, string _branch, bytes20 _commitid) payable;
|
||||
function addRepository(string _full_name) payable;
|
||||
function updateIssue(string _full_name, string _issue) payable;
|
||||
}
|
||||
|
||||
contract DGitI {
|
||||
function __register(address addrLoaded, uint256 userId, string login);
|
||||
function __addRepository(uint256 projectId, string full_name, string default_branch);
|
||||
function __setHead(uint256 projectId, string branch, bytes20 head);
|
||||
function __setTail(uint256 projectId, string branch, bytes20 tail);
|
||||
@@ -23,49 +20,29 @@ contract DGitI {
|
||||
function __setIssuePoints(uint256 projectId, uint256 issueId, uint256 userId, uint256 points);
|
||||
}
|
||||
|
||||
contract GitHubAPIOraclize is GitHubAPI, Owned, usingOraclize{
|
||||
contract GitHubOracle is GitHubAPI, Owned, usingOraclize{
|
||||
using StringLib for string;
|
||||
DGitI dGit
|
||||
|
||||
string private cred = "f94095ba1d48038d4a81,36ae0e8b1bc5ad261c936e8f7f730f6c827c221f";
|
||||
string private credentials = "?client_id=f94095ba1d48038d4a81&client_secret=36ae0e8b1bc5ad261c936e8f7f730f6c827c221f";
|
||||
string private script = "QmU6pSQMDSg8do9eZLAfjzZYcC9JpsMZeB4ZoteGkSe94y";
|
||||
string private cred = "";
|
||||
string private script = "";
|
||||
|
||||
enum OracleType { ADD_REPOSITORY, SET_USER, CLAIM_COMMIT, CLAIM_CONTINUE, UPDATE_ISSUE }
|
||||
enum OracleType { CLAIM_COMMIT, CLAIM_CONTINUE, UPDATE_ISSUE }
|
||||
mapping (bytes32 => OracleType) claimType; //temporary db enumerating oraclize calls
|
||||
mapping (bytes32 => CommitClaim) commitClaim; //temporary db for oraclize commit token claim calls
|
||||
mapping (bytes32 => UserClaim) userClaim; //temporary db for oraclize user register queries
|
||||
|
||||
//stores temporary data for oraclize user register request
|
||||
struct UserClaim {
|
||||
address sender;
|
||||
string githubid;
|
||||
}
|
||||
//stores temporary data for oraclize repository commit claim
|
||||
struct CommitClaim {
|
||||
string repository;
|
||||
bytes20 commitid;
|
||||
}
|
||||
|
||||
function GitHubAPIOraclize(){
|
||||
function GitHubOracle(string _script){
|
||||
script = _script;
|
||||
dGit = DGitI(msg.sender);
|
||||
oraclize_setProof(proofType_TLSNotary | proofStorage_IPFS);
|
||||
}
|
||||
|
||||
//register or change a github user ethereum address. 100000000000000000
|
||||
function register(address _sender, string _github_user, string _gistid)
|
||||
payable only_owner{
|
||||
bytes32 ocid = oraclize_query("nested", StringLib.concat("[identity] ${[URL] https://gist.githubusercontent.com/",_github_user,"/",_gistid,"/raw/}, ${[URL] json(https://api.github.com/gists/").concat(_gistid,credentials,").owner.[id,login]}"));
|
||||
claimType[ocid] = OracleType.SET_USER;
|
||||
userClaim[ocid] = UserClaim({sender: _sender, githubid: _github_user});
|
||||
}
|
||||
|
||||
function addRepository(string _repository)
|
||||
payable only_owner{
|
||||
bytes32 ocid = oraclize_query("URL", StringLib.concat("json(https://api.github.com/repos/",_repository,credentials,").$.id,full_name,default_branch"),4000000);
|
||||
claimType[ocid] = OracleType.ADD_REPOSITORY;
|
||||
}
|
||||
|
||||
function updateCommits(string _repository, string _branch, bytes20 _commitid)
|
||||
payable only_owner{
|
||||
bytes32 ocid = oraclize_query("computation", [script, "update-new",_repository.concat(",", _branch,",",toString(_commitid)),cred]);
|
||||
@@ -86,13 +63,9 @@ contract GitHubAPIOraclize is GitHubAPI, Owned, usingOraclize{
|
||||
event OracleEvent(bytes32 myid, string result, bytes proof);
|
||||
//oraclize response callback
|
||||
function __callback(bytes32 myid, string result, bytes proof) {
|
||||
OracleEvent(myid,result,proof);
|
||||
OracleEvent(myid, result, proof);
|
||||
if (msg.sender != oraclize.cbAddress()){
|
||||
throw;
|
||||
}else if(claimType[myid]==OracleType.SET_USER){
|
||||
_register(myid, result);
|
||||
}else if(claimType[myid] == OracleType.ADD_REPOSITORY){
|
||||
_addRepository(myid, result);
|
||||
}else if(claimType[myid]==OracleType.CLAIM_COMMIT){
|
||||
_updateCommits(myid, result, false);
|
||||
}else if(claimType[myid]==OracleType.CLAIM_CONTINUE){
|
||||
@@ -103,24 +76,7 @@ contract GitHubAPIOraclize is GitHubAPI, Owned, usingOraclize{
|
||||
delete claimType[myid]; //should always be deleted
|
||||
}
|
||||
|
||||
function _register(bytes32 myid, string result)
|
||||
internal {
|
||||
uint256 userId; string memory login; address addrLoaded;
|
||||
uint8 utype; //TODO
|
||||
bytes memory v = bytes(result);
|
||||
uint8 pos = 0;
|
||||
(addrLoaded,pos) = JSONLib.getNextAddr(v,pos);
|
||||
(userId,pos) = JSONLib.getNextUInt(v,pos);
|
||||
(login,pos) = JSONLib.getNextString(v,pos);
|
||||
if(userClaim[myid].sender == addrLoaded){
|
||||
dGit.__register(addrLoaded, userId, login);
|
||||
}
|
||||
delete userClaim[myid]; //should always be deleted
|
||||
}
|
||||
|
||||
|
||||
function _addRepository(bytes32 myid, string result) internal //[85743750, "ethereans/TheEtherian", "master"]
|
||||
{
|
||||
function _addRepository(bytes32 myid, string result) internal {//[85743750, "ethereans/TheEtherian", "master"]
|
||||
bytes memory v = bytes(result);
|
||||
uint8 pos = 0;
|
||||
string memory temp;
|
||||
@@ -133,8 +89,7 @@ contract GitHubAPIOraclize is GitHubAPI, Owned, usingOraclize{
|
||||
dGit.__addRepository(projectId,full_name,default_branch);
|
||||
}
|
||||
|
||||
function _updateCommits(bytes32 myid, string result, bool continuing)
|
||||
internal {
|
||||
function _updateCommits(bytes32 myid, string result, bool continuing) internal {
|
||||
bytes memory v = bytes(result);
|
||||
uint8 pos = 0;
|
||||
string memory temp;
|
||||
@@ -168,8 +123,7 @@ contract GitHubAPIOraclize is GitHubAPI, Owned, usingOraclize{
|
||||
}
|
||||
}
|
||||
|
||||
function _updateIssue(bytes32 myid, string result)
|
||||
internal {
|
||||
function _updateIssue(bytes32 myid, string result) internal {
|
||||
bytes memory v = bytes(result);
|
||||
uint8 pos = 0;
|
||||
string memory temp;
|
||||
@@ -195,20 +149,16 @@ contract GitHubAPIOraclize is GitHubAPI, Owned, usingOraclize{
|
||||
}
|
||||
|
||||
//owner management
|
||||
function setAPICredentials(string _client_id, string _client_secret)
|
||||
only_owner {
|
||||
function setAPICredentials(string _client_id, string _client_secret) only_owner {
|
||||
cred = StringLib.concat(_client_id,",", _client_secret);
|
||||
credentials = StringLib.concat("?client_id=",_client_id,"&client_secret="+_client_secret);
|
||||
}
|
||||
|
||||
function setScript(string _script) only_owner{
|
||||
script = _script;
|
||||
}
|
||||
|
||||
function clearAPICredentials()
|
||||
only_owner {
|
||||
function clearAPICredentials() only_owner {
|
||||
cred = "";
|
||||
credentials = "";
|
||||
}
|
||||
|
||||
function toString(bytes20 self) internal constant returns (string) {
|
||||
@@ -233,7 +183,7 @@ contract GitHubAPIOraclize is GitHubAPI, Owned, usingOraclize{
|
||||
library QueryFactory {
|
||||
|
||||
function newGitHubAPI() returns (GitHubAPI){
|
||||
return new GitHubAPIOraclize();
|
||||
return new GitHubOracle();
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,160 +0,0 @@
|
||||
//Author: Ricardo Guilherme Schmidt <3esmit@gmail.com>
|
||||
pragma solidity ^0.4.11;
|
||||
|
||||
import "lib/oraclize/oraclizeAPI_0.4.sol";
|
||||
import "lib/ethereans/management/Owned.sol";
|
||||
|
||||
contract GitHubRegisterEth is Owned, usingOraclize{
|
||||
string private credentials = "";
|
||||
mapping (bytes32 => UserClaim) userClaim; //temporary db for oraclize user register queries
|
||||
mapping (bytes32 => uint256) indexes;
|
||||
mapping (uint256 => User) users;
|
||||
|
||||
event RegisterUpdated(string name);
|
||||
|
||||
//stores temporary data for oraclize user register request
|
||||
struct UserClaim {
|
||||
address sender;
|
||||
string login;
|
||||
}
|
||||
|
||||
struct User {
|
||||
address addr;
|
||||
string login;
|
||||
}
|
||||
|
||||
function GitHubRegisterEth(){
|
||||
oraclize_setProof(proofType_TLSNotary | proofStorage_IPFS);
|
||||
}
|
||||
|
||||
function register(string _github_user, string _gistid) payable {
|
||||
bytes32 ocid = oraclize_query("nested", _getQuery(_github_user, _gistid));
|
||||
userClaim[ocid] = UserClaim({sender: msg.sender, login: _github_user});
|
||||
}
|
||||
|
||||
function getAddr(uint256 _id) public constant returns(address addr) {
|
||||
return users[_id].addr;
|
||||
}
|
||||
|
||||
function getName(address _addr) public constant returns(string name){
|
||||
return users[indexes[sha3(_addr)]].login;
|
||||
}
|
||||
|
||||
function getAddr(string _name) public constant returns(address addr) {
|
||||
return users[indexes[sha3(_name)]].addr;
|
||||
}
|
||||
|
||||
event OracleEvent(bytes32 myid, string result, bytes proof);
|
||||
|
||||
//oraclize response callback
|
||||
function __callback(bytes32 myid, string result, bytes proof) {
|
||||
OracleEvent(myid,result,proof);
|
||||
if (msg.sender != oraclize.cbAddress()){
|
||||
throw;
|
||||
}else {
|
||||
_register(myid, result);
|
||||
}
|
||||
}
|
||||
|
||||
function _register(bytes32 myid, string result) internal {
|
||||
bytes memory v = bytes(result);
|
||||
uint8 pos = 0;
|
||||
address addrLoaded;
|
||||
string memory login;
|
||||
uint256 userId;
|
||||
(addrLoaded,pos) = getNextAddr(v,pos);
|
||||
(login,pos) = getNextString(v,pos);
|
||||
(userId,pos) = getNextUInt(v,pos);
|
||||
if(userClaim[myid].sender == addrLoaded && sha3(userClaim[myid].login) == sha3(login)){
|
||||
RegisterUpdated(login);
|
||||
if(users[userId].addr != 0x0){
|
||||
delete indexes[sha3(users[userId].login)];
|
||||
delete indexes[sha3(users[userId].addr)];
|
||||
}
|
||||
indexes[sha3(addrLoaded)] = userId;
|
||||
indexes[sha3(login)] = userId;
|
||||
users[userId].addr = addrLoaded;
|
||||
users[userId].login = login;
|
||||
}
|
||||
delete userClaim[myid]; //should always be deleted
|
||||
}
|
||||
|
||||
//owner management
|
||||
function setAPICredentials(string _client_id, string _client_secret) only_owner {
|
||||
credentials = strConcat("?client_id=",_client_id,"&client_secret=",_client_secret,"");
|
||||
}
|
||||
|
||||
function clearAPICredentials() only_owner {
|
||||
credentials = "";
|
||||
}
|
||||
|
||||
//internal helper functions
|
||||
function _getQuery(string _github_user, string _gistid) internal constant returns (string){
|
||||
string memory a = strConcat("[identity] ${[URL] https://gist.githubusercontent.com/", _github_user,"/",_gistid,"/raw/registereth.txt}, ${[URL] json(https://api.github.com/gists/");
|
||||
return strConcat(a, _gistid, credentials, ").owner.[login,id]}","");
|
||||
}
|
||||
|
||||
function getNextString(bytes _str, uint8 _pos) internal constant returns (string,uint8) {
|
||||
uint8 start = 0;
|
||||
uint8 end = 0;
|
||||
uint strl =_str.length;
|
||||
for (;strl > _pos; _pos++) {
|
||||
if (_str[_pos] == '"'){ //Found quotation mark
|
||||
if(_str[_pos-1] != '\\'){ //is not escaped
|
||||
end = start == 0 ? 0: _pos;
|
||||
start = start == 0 ? (_pos+1) : start;
|
||||
if(end > 0) break;
|
||||
}
|
||||
}
|
||||
}
|
||||
bytes memory str = new bytes(end-start);
|
||||
for(_pos=0; _pos<str.length; _pos++){
|
||||
str[_pos] = _str[start+_pos];
|
||||
}
|
||||
for(_pos=end+1; _pos<_str.length; _pos++) if (_str[_pos] == ','){ _pos++; break; } //end
|
||||
|
||||
return (string(str),_pos);
|
||||
}
|
||||
|
||||
function getNextUInt(bytes _str, uint8 _pos) internal constant returns (uint,uint8) {
|
||||
uint val = 0;
|
||||
uint strl =_str.length;
|
||||
for (; strl > _pos; _pos++) {
|
||||
byte bp = _str[_pos];
|
||||
if (bp == ','){ //Find ends
|
||||
_pos++; break;
|
||||
}else if ((bp >= 48)&&(bp <= 57)){ //only ASCII numbers
|
||||
val *= 10;
|
||||
val += uint(bp) - 48;
|
||||
}
|
||||
}
|
||||
return (val,_pos);
|
||||
}
|
||||
|
||||
function getNextAddr(bytes _str, uint8 _pos) internal constant returns (address, uint8){
|
||||
uint160 iaddr = 0;
|
||||
uint strl =_str.length;
|
||||
for(;strl > _pos; _pos++){
|
||||
byte bp = _str[_pos];
|
||||
if (bp == '0'){
|
||||
if (_str[_pos+1] == 'x'){
|
||||
for (_pos=_pos+2; _pos<2+2*20; _pos+=2){
|
||||
iaddr *= 256;
|
||||
iaddr += (uint160(hexVal(uint160(_str[_pos])))*16+uint160(hexVal(uint160(_str[_pos+1]))));
|
||||
}
|
||||
_pos++;
|
||||
break;
|
||||
}
|
||||
}else if (bp == ','){
|
||||
_pos++;
|
||||
break;
|
||||
}
|
||||
}
|
||||
return (address(iaddr),_pos);
|
||||
}
|
||||
|
||||
function hexVal(uint val) internal constant returns (uint){
|
||||
return val - (val < 58 ? 48 : (val < 97 ? 55 : 87));
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,81 @@
|
||||
//Author: Ricardo Guilherme Schmidt <3esmit@gmail.com>
|
||||
pragma solidity ^0.4.11;
|
||||
|
||||
import "GitHubAPIReg.sol";
|
||||
import "NameRegistry.sol";
|
||||
import "GitRepository.sol";
|
||||
|
||||
contract GitHubRepositoryReg is NameRegistry, GitHubAPIReg {
|
||||
|
||||
mapping (uint256 => Repository) repositories;
|
||||
|
||||
event UpdatedRepository(address addr, uint256 projectId, string full_name, string default_branch);
|
||||
|
||||
struct Repository {
|
||||
address addr;
|
||||
string full_name;
|
||||
string branch;
|
||||
}
|
||||
|
||||
function GitHubRepositoryReg(){
|
||||
oraclize_setProof(proofType_TLSNotary | proofStorage_IPFS);
|
||||
}
|
||||
|
||||
function setRepository(string _repository, bool create) payable only_owner{
|
||||
oraclize_query("URL", getQuery(_repository), create? 4000000 : 1000000);
|
||||
}
|
||||
|
||||
function getAddr(uint256 _id) public constant returns(address addr) {
|
||||
return repositories[_id].addr;
|
||||
}
|
||||
|
||||
function getName(address _addr) public constant returns(string name){
|
||||
return repositories[indexes[sha3(_addr)]].login;
|
||||
}
|
||||
|
||||
function getAddr(string _name) public constant returns(address addr) {
|
||||
return repositories[indexes[sha3(_name)]].addr;
|
||||
}
|
||||
|
||||
//oraclize response callback
|
||||
function __callback(bytes32 myid, string result, bytes proof) {
|
||||
OracleEvent(myid,result,proof);
|
||||
if (msg.sender != oraclize.cbAddress()){
|
||||
throw;
|
||||
}else {
|
||||
_setRepository(myid, result);
|
||||
}
|
||||
}
|
||||
|
||||
function _setRepository(bytes32 myid, string result) internal //[85743750, "ethereans/TheEtherian", "master"]
|
||||
{
|
||||
bytes memory v = bytes(result);
|
||||
uint8 pos = 0;
|
||||
string memory temp;
|
||||
uint256 projectId;
|
||||
(projectId,pos) = getNextUInt(v,pos);
|
||||
string memory full_name;
|
||||
(full_name,pos) = getNextString(v,pos);
|
||||
string memory default_branch;
|
||||
(default_branch,pos) = getNextString(v,pos);
|
||||
address repoAddr = repositories[projectId].addr;
|
||||
if(repoAddr == 0x0){
|
||||
repoAddr = address(GitFactory.newGitRepository(projectId, full_name, default_branch));
|
||||
indexes[sha3(repoAddr)] = projectId;
|
||||
indexes[sha3(full_name)] = projectId;
|
||||
NewRepository(repoAddr, projectId, full_name, default_branch);
|
||||
repositories[projectId] = Repository(addr: repoAddr, full_name: full_name, default_branch: default_branch);|
|
||||
}else{
|
||||
bytes32 _new = sha3(full_name);
|
||||
bytes32 _old = sha3(repositories[projectId].full_name);
|
||||
if(_new != _old){
|
||||
_updateIndex(_old, _new);
|
||||
}
|
||||
}
|
||||
}
|
||||
//internal helper functions
|
||||
function _getQuery(string _repository) internal constant returns (string){
|
||||
return strConcat("json(https://api.github.com/repos/",_repository,credentials,").$.id,full_name,default_branch");
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,81 @@
|
||||
//Author: Ricardo Guilherme Schmidt <3esmit@gmail.com>
|
||||
pragma solidity ^0.4.11;
|
||||
|
||||
import "GitHubAPIReg.sol";
|
||||
import "NameRegistry.sol";
|
||||
|
||||
contract GitHubUserReg is NameRegistry, GitHubAPIReg {
|
||||
|
||||
mapping (bytes32 => UserClaim) userClaim; //temporary db for oraclize user register queries
|
||||
mapping (uint256 => User) users;
|
||||
|
||||
event RegisterUpdated(string name);
|
||||
|
||||
//stores temporary data for oraclize user register request
|
||||
struct UserClaim {
|
||||
address sender;
|
||||
string login;
|
||||
}
|
||||
|
||||
struct User {
|
||||
address addr;
|
||||
string login;
|
||||
}
|
||||
|
||||
function register(string _github_user, string _gistid) payable {
|
||||
bytes32 ocid = oraclize_query("nested", _getQuery(_github_user, _gistid));
|
||||
userClaim[ocid] = UserClaim({sender: msg.sender, login: _github_user});
|
||||
}
|
||||
|
||||
function getAddr(uint256 _id) public constant returns(address addr) {
|
||||
return users[_id].addr;
|
||||
}
|
||||
|
||||
function getName(address _addr) public constant returns(string name){
|
||||
return users[indexes[sha3(_addr)]].login;
|
||||
}
|
||||
|
||||
function getAddr(string _name) public constant returns(address addr) {
|
||||
return users[indexes[sha3(_name)]].addr;
|
||||
}
|
||||
|
||||
//oraclize response callback
|
||||
function __callback(bytes32 myid, string result, bytes proof) {
|
||||
OracleEvent(myid, result, proof);
|
||||
if (msg.sender != oraclize.cbAddress()){
|
||||
throw;
|
||||
}else {
|
||||
_register(myid, result);
|
||||
}
|
||||
}
|
||||
|
||||
function _register(bytes32 myid, string result) internal {
|
||||
bytes memory v = bytes(result);
|
||||
uint8 pos = 0;
|
||||
address addrLoaded;
|
||||
string memory login;
|
||||
uint256 userId;
|
||||
(addrLoaded,pos) = getNextAddr(v,pos);
|
||||
(login,pos) = getNextString(v,pos);
|
||||
(userId,pos) = getNextUInt(v,pos);
|
||||
if(userClaim[myid].sender == addrLoaded && sha3(userClaim[myid].login) == sha3(login)){
|
||||
RegisterUpdated(login);
|
||||
if(users[userId].addr != 0x0){
|
||||
delete indexes[sha3(users[userId].login)];
|
||||
delete indexes[sha3(users[userId].addr)];
|
||||
}
|
||||
indexes[sha3(addrLoaded)] = userId;
|
||||
indexes[sha3(login)] = userId;
|
||||
users[userId].addr = addrLoaded;
|
||||
users[userId].login = login;
|
||||
}
|
||||
delete userClaim[myid]; //should always be deleted
|
||||
}
|
||||
|
||||
//internal helper functions
|
||||
function _getQuery(string _github_user, string _gistid) internal constant returns (string){
|
||||
string memory a = strConcat("[identity] ${[URL] https://gist.githubusercontent.com/", _github_user,"/",_gistid,"/raw/registereth.txt}, ${[URL] json(https://api.github.com/gists/");
|
||||
return strConcat(a, _gistid, credentials, ").owner.[login,id]}","");
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,5 @@
|
||||
contract NameRegistry{
|
||||
function getAddr(uint256 _id) public constant returns(address addr);
|
||||
function getAddr(string _name) public constant returns(address addr);
|
||||
function getName(address _addr) public constant returns(string name);
|
||||
}
|
||||
Reference in New Issue
Block a user