Skip to content

Latest commit

History

20 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

MName Server (mns)

Dgram Server to query phone number information (carrier) over DNS protocol

Why ?

This project started from a need at kkiaPay where we provide an API to allow developers to collect payments on their sites by Mobile Money. In the mobile money system the account number is simply a phone number of the subscriber. To process a mobile money payment, when the customer enters his phone number, we needed to instantly validate the number, determine the wallet provider (his bank in some way) and display in the form the logo of his bank (wallet provider).

The naive approach would be to embed this control in the client program. But operators regularly add support for new routes, so if we don't want to publish a new version of our libraries every time the operator changes, we need to have the control done remotely on a server.

The first approach was an http API, but soon we noticed several difficulties:

  • An http API is overkill for our needs and introduces unnecessary latency
  • The number of phone number resolution requests was too high and was unnecessarily occupying the bandwidth of our load balancers.

Solution

Detecting the provider corresponding to a phone number is similar to resolving a domain name. And the internet has a very nice decentralized protocol when it comes to asking for a route: the DNS protocol.

The protocol is built around binary messages and is compact on UDP (TCP is also used but on another part of the protocol that does not concern our context). These characteristics, the tooling on top of the protocol (there are clients on all platforms) and the embedded caching logic make it an excellent option for our phone number resolution needs.

The idea was to build a DNS server, but instead of responding to domain name resolution requests, it would respond to phone number lookups.

This implementation is based on RFC 1035. RFC 1035


How it Works

Using unix client (dig)

; <<>> DiG 9.10.6 <<>> @ns4.kkiapay.me -t NS 229.67434270
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 36524
;; flags: qr rd ad; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0
;; WARNING: recursion requested but not available
;; QUESTION SECTION:
;229.67434270. IN	NS
;; ANSWER SECTION:
229.67434270. 300	IN	NS	mtn-bj.
;; Query time: 3 msec
;; SERVER: 167.172.156.170#53(167.172.156.170)
;; WHEN: Wed Oct 27 21:56:54 WAT 2021
;; MSG SIZE rcvd: 62

Using nodejs client

const{ Resolver }=require('dns').promises;constresolver=newResolver();resolver.setServers(['ns4.kkiapay.me']);resolver.resolveNs("229.67434270").then((addr)=>{console.log(addr)// mtn-bj})

From the browser

To my disappointment, browsers do not offer an API to perform DNS queries: https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/dns

Contribute

You can compile and host your own version of the server or freely use the ns4.kkiapay.me name server and give us feedback on this project. But like a DNS server mesh, the idea is to have a distributed network of MNS.

So you can contribute on several levels:

  • Host a test version
  • Enrich the database
  • Contribute to the code

Roadmap

Many things remain to be done for a first stable version:

  • Stub resolvers for recursive queries
  • Add a client to easily interact with the database
  • Implement other types of requests

deps

Disclosure

This project is still in the experimental phase and ns4.kkiapay.me is purely a demo instance, so do not rely on the data returned by this server yet.

About

Dgram Server to query phone number information (carrier) over DNS protocol

Resources

Stars

13 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
GitHub - issotina/mns: Dgram Server to query phone number information (carrier) over DNS protocol · GitHub
Skip to content

Latest commit

History

20 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

MName Server (mns)

Dgram Server to query phone number information (carrier) over DNS protocol

Why ?

This project started from a need at kkiaPay where we provide an API to allow developers to collect payments on their sites by Mobile Money. In the mobile money system the account number is simply a phone number of the subscriber. To process a mobile money payment, when the customer enters his phone number, we needed to instantly validate the number, determine the wallet provider (his bank in some way) and display in the form the logo of his bank (wallet provider).

The naive approach would be to embed this control in the client program. But operators regularly add support for new routes, so if we don't want to publish a new version of our libraries every time the operator changes, we need to have the control done remotely on a server.

The first approach was an http API, but soon we noticed several difficulties:

  • An http API is overkill for our needs and introduces unnecessary latency
  • The number of phone number resolution requests was too high and was unnecessarily occupying the bandwidth of our load balancers.

Solution

Detecting the provider corresponding to a phone number is similar to resolving a domain name. And the internet has a very nice decentralized protocol when it comes to asking for a route: the DNS protocol.

The protocol is built around binary messages and is compact on UDP (TCP is also used but on another part of the protocol that does not concern our context). These characteristics, the tooling on top of the protocol (there are clients on all platforms) and the embedded caching logic make it an excellent option for our phone number resolution needs.

The idea was to build a DNS server, but instead of responding to domain name resolution requests, it would respond to phone number lookups.

This implementation is based on RFC 1035. RFC 1035


How it Works

Using unix client (dig)

; <<>> DiG 9.10.6 <<>> @ns4.kkiapay.me -t NS 229.67434270
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 36524
;; flags: qr rd ad; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0
;; WARNING: recursion requested but not available
;; QUESTION SECTION:
;229.67434270. IN	NS
;; ANSWER SECTION:
229.67434270. 300	IN	NS	mtn-bj.
;; Query time: 3 msec
;; SERVER: 167.172.156.170#53(167.172.156.170)
;; WHEN: Wed Oct 27 21:56:54 WAT 2021
;; MSG SIZE rcvd: 62

Using nodejs client

const{ Resolver }=require('dns').promises;constresolver=newResolver();resolver.setServers(['ns4.kkiapay.me']);resolver.resolveNs("229.67434270").then((addr)=>{console.log(addr)// mtn-bj})

From the browser

To my disappointment, browsers do not offer an API to perform DNS queries: https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/dns

Contribute

You can compile and host your own version of the server or freely use the ns4.kkiapay.me name server and give us feedback on this project. But like a DNS server mesh, the idea is to have a distributed network of MNS.

So you can contribute on several levels:

  • Host a test version
  • Enrich the database
  • Contribute to the code

Roadmap

Many things remain to be done for a first stable version:

  • Stub resolvers for recursive queries
  • Add a client to easily interact with the database
  • Implement other types of requests

deps

Disclosure

This project is still in the experimental phase and ns4.kkiapay.me is purely a demo instance, so do not rely on the data returned by this server yet.

About

Dgram Server to query phone number information (carrier) over DNS protocol

Resources

Stars

13 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - issotina/mns: Dgram Server to query phone number information (carrier) over DNS protocol · GitHub
Skip to content

Latest commit

History

20 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

MName Server (mns)

Dgram Server to query phone number information (carrier) over DNS protocol

Why ?

This project started from a need at kkiaPay where we provide an API to allow developers to collect payments on their sites by Mobile Money. In the mobile money system the account number is simply a phone number of the subscriber. To process a mobile money payment, when the customer enters his phone number, we needed to instantly validate the number, determine the wallet provider (his bank in some way) and display in the form the logo of his bank (wallet provider).

The naive approach would be to embed this control in the client program. But operators regularly add support for new routes, so if we don't want to publish a new version of our libraries every time the operator changes, we need to have the control done remotely on a server.

The first approach was an http API, but soon we noticed several difficulties:

  • An http API is overkill for our needs and introduces unnecessary latency
  • The number of phone number resolution requests was too high and was unnecessarily occupying the bandwidth of our load balancers.

Solution

Detecting the provider corresponding to a phone number is similar to resolving a domain name. And the internet has a very nice decentralized protocol when it comes to asking for a route: the DNS protocol.

The protocol is built around binary messages and is compact on UDP (TCP is also used but on another part of the protocol that does not concern our context). These characteristics, the tooling on top of the protocol (there are clients on all platforms) and the embedded caching logic make it an excellent option for our phone number resolution needs.

The idea was to build a DNS server, but instead of responding to domain name resolution requests, it would respond to phone number lookups.

This implementation is based on RFC 1035. RFC 1035


How it Works

Using unix client (dig)

; <<>> DiG 9.10.6 <<>> @ns4.kkiapay.me -t NS 229.67434270
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 36524
;; flags: qr rd ad; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0
;; WARNING: recursion requested but not available
;; QUESTION SECTION:
;229.67434270. IN	NS
;; ANSWER SECTION:
229.67434270. 300	IN	NS	mtn-bj.
;; Query time: 3 msec
;; SERVER: 167.172.156.170#53(167.172.156.170)
;; WHEN: Wed Oct 27 21:56:54 WAT 2021
;; MSG SIZE rcvd: 62

Using nodejs client

const{ Resolver }=require('dns').promises;constresolver=newResolver();resolver.setServers(['ns4.kkiapay.me']);resolver.resolveNs("229.67434270").then((addr)=>{console.log(addr)// mtn-bj})

From the browser

To my disappointment, browsers do not offer an API to perform DNS queries: https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/dns

Contribute

You can compile and host your own version of the server or freely use the ns4.kkiapay.me name server and give us feedback on this project. But like a DNS server mesh, the idea is to have a distributed network of MNS.

So you can contribute on several levels:

  • Host a test version
  • Enrich the database
  • Contribute to the code

Roadmap

Many things remain to be done for a first stable version:

  • Stub resolvers for recursive queries
  • Add a client to easily interact with the database
  • Implement other types of requests

deps

Disclosure

This project is still in the experimental phase and ns4.kkiapay.me is purely a demo instance, so do not rely on the data returned by this server yet.

About

Dgram Server to query phone number information (carrier) over DNS protocol

Resources

Stars

13 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - issotina/mns: Dgram Server to query phone number information (carrier) over DNS protocol · GitHub
Skip to content

Latest commit

History

20 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

MName Server (mns)

Dgram Server to query phone number information (carrier) over DNS protocol

Why ?

This project started from a need at kkiaPay where we provide an API to allow developers to collect payments on their sites by Mobile Money. In the mobile money system the account number is simply a phone number of the subscriber. To process a mobile money payment, when the customer enters his phone number, we needed to instantly validate the number, determine the wallet provider (his bank in some way) and display in the form the logo of his bank (wallet provider).

The naive approach would be to embed this control in the client program. But operators regularly add support for new routes, so if we don't want to publish a new version of our libraries every time the operator changes, we need to have the control done remotely on a server.

The first approach was an http API, but soon we noticed several difficulties:

  • An http API is overkill for our needs and introduces unnecessary latency
  • The number of phone number resolution requests was too high and was unnecessarily occupying the bandwidth of our load balancers.

Solution

Detecting the provider corresponding to a phone number is similar to resolving a domain name. And the internet has a very nice decentralized protocol when it comes to asking for a route: the DNS protocol.

The protocol is built around binary messages and is compact on UDP (TCP is also used but on another part of the protocol that does not concern our context). These characteristics, the tooling on top of the protocol (there are clients on all platforms) and the embedded caching logic make it an excellent option for our phone number resolution needs.

The idea was to build a DNS server, but instead of responding to domain name resolution requests, it would respond to phone number lookups.

This implementation is based on RFC 1035. RFC 1035


How it Works

Using unix client (dig)

; <<>> DiG 9.10.6 <<>> @ns4.kkiapay.me -t NS 229.67434270
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 36524
;; flags: qr rd ad; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0
;; WARNING: recursion requested but not available
;; QUESTION SECTION:
;229.67434270. IN	NS
;; ANSWER SECTION:
229.67434270. 300	IN	NS	mtn-bj.
;; Query time: 3 msec
;; SERVER: 167.172.156.170#53(167.172.156.170)
;; WHEN: Wed Oct 27 21:56:54 WAT 2021
;; MSG SIZE rcvd: 62

Using nodejs client

const{ Resolver }=require('dns').promises;constresolver=newResolver();resolver.setServers(['ns4.kkiapay.me']);resolver.resolveNs("229.67434270").then((addr)=>{console.log(addr)// mtn-bj})

From the browser

To my disappointment, browsers do not offer an API to perform DNS queries: https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/dns

Contribute

You can compile and host your own version of the server or freely use the ns4.kkiapay.me name server and give us feedback on this project. But like a DNS server mesh, the idea is to have a distributed network of MNS.

So you can contribute on several levels:

  • Host a test version
  • Enrich the database
  • Contribute to the code

Roadmap

Many things remain to be done for a first stable version:

  • Stub resolvers for recursive queries
  • Add a client to easily interact with the database
  • Implement other types of requests

deps

Disclosure

This project is still in the experimental phase and ns4.kkiapay.me is purely a demo instance, so do not rely on the data returned by this server yet.

About

Dgram Server to query phone number information (carrier) over DNS protocol

Resources

Stars

13 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ' GitHub - issotina/mns: Dgram Server to query phone number information (carrier) over DNS protocol · GitHub
Skip to content

Latest commit

History

20 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

MName Server (mns)

Dgram Server to query phone number information (carrier) over DNS protocol

Why ?

This project started from a need at kkiaPay where we provide an API to allow developers to collect payments on their sites by Mobile Money. In the mobile money system the account number is simply a phone number of the subscriber. To process a mobile money payment, when the customer enters his phone number, we needed to instantly validate the number, determine the wallet provider (his bank in some way) and display in the form the logo of his bank (wallet provider).

The naive approach would be to embed this control in the client program. But operators regularly add support for new routes, so if we don't want to publish a new version of our libraries every time the operator changes, we need to have the control done remotely on a server.

The first approach was an http API, but soon we noticed several difficulties:

  • An http API is overkill for our needs and introduces unnecessary latency
  • The number of phone number resolution requests was too high and was unnecessarily occupying the bandwidth of our load balancers.

Solution

Detecting the provider corresponding to a phone number is similar to resolving a domain name. And the internet has a very nice decentralized protocol when it comes to asking for a route: the DNS protocol.

The protocol is built around binary messages and is compact on UDP (TCP is also used but on another part of the protocol that does not concern our context). These characteristics, the tooling on top of the protocol (there are clients on all platforms) and the embedded caching logic make it an excellent option for our phone number resolution needs.

The idea was to build a DNS server, but instead of responding to domain name resolution requests, it would respond to phone number lookups.

This implementation is based on RFC 1035. RFC 1035


How it Works

Using unix client (dig)

; <<>> DiG 9.10.6 <<>> @ns4.kkiapay.me -t NS 229.67434270
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 36524
;; flags: qr rd ad; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0
;; WARNING: recursion requested but not available
;; QUESTION SECTION:
;229.67434270. IN	NS
;; ANSWER SECTION:
229.67434270. 300	IN	NS	mtn-bj.
;; Query time: 3 msec
;; SERVER: 167.172.156.170#53(167.172.156.170)
;; WHEN: Wed Oct 27 21:56:54 WAT 2021
;; MSG SIZE rcvd: 62

Using nodejs client

const{ Resolver }=require('dns').promises;constresolver=newResolver();resolver.setServers(['ns4.kkiapay.me']);resolver.resolveNs("229.67434270").then((addr)=>{console.log(addr)// mtn-bj})

From the browser

To my disappointment, browsers do not offer an API to perform DNS queries: https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/dns

Contribute

You can compile and host your own version of the server or freely use the ns4.kkiapay.me name server and give us feedback on this project. But like a DNS server mesh, the idea is to have a distributed network of MNS.

So you can contribute on several levels:

  • Host a test version
  • Enrich the database
  • Contribute to the code

Roadmap

Many things remain to be done for a first stable version:

  • Stub resolvers for recursive queries
  • Add a client to easily interact with the database
  • Implement other types of requests

deps

Disclosure

This project is still in the experimental phase and ns4.kkiapay.me is purely a demo instance, so do not rely on the data returned by this server yet.

About

Dgram Server to query phone number information (carrier) over DNS protocol

Resources

Stars

13 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - issotina/mns: Dgram Server to query phone number information (carrier) over DNS protocol · GitHub
Skip to content

Latest commit

History

20 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

MName Server (mns)

Dgram Server to query phone number information (carrier) over DNS protocol

Why ?

This project started from a need at kkiaPay where we provide an API to allow developers to collect payments on their sites by Mobile Money. In the mobile money system the account number is simply a phone number of the subscriber. To process a mobile money payment, when the customer enters his phone number, we needed to instantly validate the number, determine the wallet provider (his bank in some way) and display in the form the logo of his bank (wallet provider).

The naive approach would be to embed this control in the client program. But operators regularly add support for new routes, so if we don't want to publish a new version of our libraries every time the operator changes, we need to have the control done remotely on a server.

The first approach was an http API, but soon we noticed several difficulties:

  • An http API is overkill for our needs and introduces unnecessary latency
  • The number of phone number resolution requests was too high and was unnecessarily occupying the bandwidth of our load balancers.

Solution

Detecting the provider corresponding to a phone number is similar to resolving a domain name. And the internet has a very nice decentralized protocol when it comes to asking for a route: the DNS protocol.

The protocol is built around binary messages and is compact on UDP (TCP is also used but on another part of the protocol that does not concern our context). These characteristics, the tooling on top of the protocol (there are clients on all platforms) and the embedded caching logic make it an excellent option for our phone number resolution needs.

The idea was to build a DNS server, but instead of responding to domain name resolution requests, it would respond to phone number lookups.

This implementation is based on RFC 1035. RFC 1035


How it Works

Using unix client (dig)

; <<>> DiG 9.10.6 <<>> @ns4.kkiapay.me -t NS 229.67434270
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 36524
;; flags: qr rd ad; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0
;; WARNING: recursion requested but not available
;; QUESTION SECTION:
;229.67434270. IN	NS
;; ANSWER SECTION:
229.67434270. 300	IN	NS	mtn-bj.
;; Query time: 3 msec
;; SERVER: 167.172.156.170#53(167.172.156.170)
;; WHEN: Wed Oct 27 21:56:54 WAT 2021
;; MSG SIZE rcvd: 62

Using nodejs client

const{ Resolver }=require('dns').promises;constresolver=newResolver();resolver.setServers(['ns4.kkiapay.me']);resolver.resolveNs("229.67434270").then((addr)=>{console.log(addr)// mtn-bj})

From the browser

To my disappointment, browsers do not offer an API to perform DNS queries: https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/dns

Contribute

You can compile and host your own version of the server or freely use the ns4.kkiapay.me name server and give us feedback on this project. But like a DNS server mesh, the idea is to have a distributed network of MNS.

So you can contribute on several levels:

  • Host a test version
  • Enrich the database
  • Contribute to the code

Roadmap

Many things remain to be done for a first stable version:

  • Stub resolvers for recursive queries
  • Add a client to easily interact with the database
  • Implement other types of requests

deps

Disclosure

This project is still in the experimental phase and ns4.kkiapay.me is purely a demo instance, so do not rely on the data returned by this server yet.

About

Dgram Server to query phone number information (carrier) over DNS protocol

Resources

Stars

13 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - issotina/mns: Dgram Server to query phone number information (carrier) over DNS protocol · GitHub
Skip to content

Latest commit

History

20 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

MName Server (mns)

Dgram Server to query phone number information (carrier) over DNS protocol

Why ?

This project started from a need at kkiaPay where we provide an API to allow developers to collect payments on their sites by Mobile Money. In the mobile money system the account number is simply a phone number of the subscriber. To process a mobile money payment, when the customer enters his phone number, we needed to instantly validate the number, determine the wallet provider (his bank in some way) and display in the form the logo of his bank (wallet provider).

The naive approach would be to embed this control in the client program. But operators regularly add support for new routes, so if we don't want to publish a new version of our libraries every time the operator changes, we need to have the control done remotely on a server.

The first approach was an http API, but soon we noticed several difficulties:

  • An http API is overkill for our needs and introduces unnecessary latency
  • The number of phone number resolution requests was too high and was unnecessarily occupying the bandwidth of our load balancers.

Solution

Detecting the provider corresponding to a phone number is similar to resolving a domain name. And the internet has a very nice decentralized protocol when it comes to asking for a route: the DNS protocol.

The protocol is built around binary messages and is compact on UDP (TCP is also used but on another part of the protocol that does not concern our context). These characteristics, the tooling on top of the protocol (there are clients on all platforms) and the embedded caching logic make it an excellent option for our phone number resolution needs.

The idea was to build a DNS server, but instead of responding to domain name resolution requests, it would respond to phone number lookups.

This implementation is based on RFC 1035. RFC 1035


How it Works

Using unix client (dig)

; <<>> DiG 9.10.6 <<>> @ns4.kkiapay.me -t NS 229.67434270
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 36524
;; flags: qr rd ad; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0
;; WARNING: recursion requested but not available
;; QUESTION SECTION:
;229.67434270. IN	NS
;; ANSWER SECTION:
229.67434270. 300	IN	NS	mtn-bj.
;; Query time: 3 msec
;; SERVER: 167.172.156.170#53(167.172.156.170)
;; WHEN: Wed Oct 27 21:56:54 WAT 2021
;; MSG SIZE rcvd: 62

Using nodejs client

const{ Resolver }=require('dns').promises;constresolver=newResolver();resolver.setServers(['ns4.kkiapay.me']);resolver.resolveNs("229.67434270").then((addr)=>{console.log(addr)// mtn-bj})

From the browser

To my disappointment, browsers do not offer an API to perform DNS queries: https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/dns

Contribute

You can compile and host your own version of the server or freely use the ns4.kkiapay.me name server and give us feedback on this project. But like a DNS server mesh, the idea is to have a distributed network of MNS.

So you can contribute on several levels:

  • Host a test version
  • Enrich the database
  • Contribute to the code

Roadmap

Many things remain to be done for a first stable version:

  • Stub resolvers for recursive queries
  • Add a client to easily interact with the database
  • Implement other types of requests

deps

Disclosure

This project is still in the experimental phase and ns4.kkiapay.me is purely a demo instance, so do not rely on the data returned by this server yet.

About

Dgram Server to query phone number information (carrier) over DNS protocol

Resources

Stars

13 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Universal Dark Mode - works on any site (function() { var enabled = true; function applyDarkMode() { if (!enabled) return; // Create style element if it doesn't exist var style = document.getElementById('universal-dark-mode-style'); if (!style) { style = document.createElement('style'); style.id = 'universal-dark-mode-style'; document.head.appendChild(style); } // Dark mode CSS - inverts colors but preserves images/video style.textContent = ' /* Invert everything except media */ html { filter: invert(1) hue-rotate(180deg) !important; background: #1a1a2e !important; } /* Restore images, videos, iframes, canvas */ img, video, iframe, canvas, svg, picture, [style*="background-image"] { filter: invert(1) hue-rotate(180deg) !important; } /* Preserve specific elements that should not be inverted */ .no-dark-mode, .no-dark-mode *, [data-theme="light"], [data-theme="light"], .ace_editor, .ace_editor *, .CodeMirror, .CodeMirror *, .monaco-editor, .monaco-editor *, .markdown-body pre, .markdown-body pre *, .highlight, .highlight *, pre code, pre code * { filter: none !important; } /* Fix common UI elements */ .modal, .popup, .dropdown-menu, .tooltip, .popover { filter: invert(1) hue-rotate(180deg) !important; background: #2d2d44 !important; border-color: #444 !important; } /* Scrollbars */ ::-webkit-scrollbar { background: #1a1a2e !important; } ::-webkit-scrollbar-thumb { background: #444 !important; } ::-webkit-scrollbar-thumb:hover { background: #555 !important; } /* Selection */ ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; } ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; } '; } function removeDarkMode() { var style = document.getElementById('universal-dark-mode-style'); if (style) style.remove(); } // Toggle with Alt+Shift+D document.addEventListener('keydown', function(e) { if (e.altKey && e.shiftKey && e.key === 'D') { e.preventDefault(); enabled = !enabled; if (enabled) { applyDarkMode(); console.log('[Universal Dark Mode] Enabled'); } else { removeDarkMode(); console.log('[Universal Dark Mode] Disabled'); } } }); // Apply on load applyDarkMode(); // Re-apply on dynamic content var observer = new MutationObserver(function(mutations) { if (enabled && !document.getElementById('universal-dark-mode-style')) { applyDarkMode(); } }); observer.observe(document.head, { childList: true }); console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle'); })(); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })(); GitHub - issotina/mns: Dgram Server to query phone number information (carrier) over DNS protocol · GitHub
Skip to content

Latest commit

History

20 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

MName Server (mns)

Dgram Server to query phone number information (carrier) over DNS protocol

Why ?

This project started from a need at kkiaPay where we provide an API to allow developers to collect payments on their sites by Mobile Money. In the mobile money system the account number is simply a phone number of the subscriber. To process a mobile money payment, when the customer enters his phone number, we needed to instantly validate the number, determine the wallet provider (his bank in some way) and display in the form the logo of his bank (wallet provider).

The naive approach would be to embed this control in the client program. But operators regularly add support for new routes, so if we don't want to publish a new version of our libraries every time the operator changes, we need to have the control done remotely on a server.

The first approach was an http API, but soon we noticed several difficulties:

  • An http API is overkill for our needs and introduces unnecessary latency
  • The number of phone number resolution requests was too high and was unnecessarily occupying the bandwidth of our load balancers.

Solution

Detecting the provider corresponding to a phone number is similar to resolving a domain name. And the internet has a very nice decentralized protocol when it comes to asking for a route: the DNS protocol.

The protocol is built around binary messages and is compact on UDP (TCP is also used but on another part of the protocol that does not concern our context). These characteristics, the tooling on top of the protocol (there are clients on all platforms) and the embedded caching logic make it an excellent option for our phone number resolution needs.

The idea was to build a DNS server, but instead of responding to domain name resolution requests, it would respond to phone number lookups.

This implementation is based on RFC 1035. RFC 1035


How it Works

Using unix client (dig)

; <<>> DiG 9.10.6 <<>> @ns4.kkiapay.me -t NS 229.67434270
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 36524
;; flags: qr rd ad; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0
;; WARNING: recursion requested but not available
;; QUESTION SECTION:
;229.67434270. IN	NS
;; ANSWER SECTION:
229.67434270. 300	IN	NS	mtn-bj.
;; Query time: 3 msec
;; SERVER: 167.172.156.170#53(167.172.156.170)
;; WHEN: Wed Oct 27 21:56:54 WAT 2021
;; MSG SIZE rcvd: 62

Using nodejs client

const{ Resolver }=require('dns').promises;constresolver=newResolver();resolver.setServers(['ns4.kkiapay.me']);resolver.resolveNs("229.67434270").then((addr)=>{console.log(addr)// mtn-bj})

From the browser

To my disappointment, browsers do not offer an API to perform DNS queries: https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/dns

Contribute

You can compile and host your own version of the server or freely use the ns4.kkiapay.me name server and give us feedback on this project. But like a DNS server mesh, the idea is to have a distributed network of MNS.

So you can contribute on several levels:

  • Host a test version
  • Enrich the database
  • Contribute to the code

Roadmap

Many things remain to be done for a first stable version:

  • Stub resolvers for recursive queries
  • Add a client to easily interact with the database
  • Implement other types of requests

deps

Disclosure

This project is still in the experimental phase and ns4.kkiapay.me is purely a demo instance, so do not rely on the data returned by this server yet.

About

Dgram Server to query phone number information (carrier) over DNS protocol

Resources

Stars

13 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages