Bringing easy OAuth to Qt

June 24th, 2009

Lastly I spent some time looking for a decent OAuth support for C++. I found that the only available libary (which is actually a pure C code), surely does what I expect, but provides pretty complicated API making it inconvenient to use. And I’m kind of a lazy guy (oh who’s not :-) ) and I’m getting scared with just thinking of writing tens of lines of code to complete just a single OAuth request. Plus, instead of endlessly converting from QString and QByteArray to char* I’d prefer to have some friendly, Qt-compatible way to deal with the whole OAuth thing. That’s how the idea of QOAuth came up.

What is QOAuth?

QOAuth is an attempt to support interaction with OAuth-powered network services in a Qt way, i.e. simply, clearly and efficiently. It gives the application developer no more than 4 methods, namely:
  • requestToken() – to obtain an unauthorized Request Token,
  • accessToken() – to exchange Request Token for the Access Token,
  • createParametersString() – to construct a request according to OAuth authorization scheme.
  • inlineParameters() – provided for convenience, to create a query string from given parameters.

First two methods serve application authorization purposes, whilst the other two are used for accessing Protected Resources (all funny names by OAuth Core 1.0 Specification – but don’t go there if you’re not familiar with OAuth, you better start here).

QOAuth internally makes use of QCA (Qt Cryptographic Architecture), thus depends on it. It’s also known to send and process network requests, so apart from QtCore it will need QtNetwork module to work.

OAuth authorization with QOAuth

As I mentioned, the point in QOAuth is to be user-friendly, yet powerful. See the code example of obtaining a Request Token form the Service Provider:

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
QByteArray token;
QByteArray tokenSecret;

QOAuth qoauth = new QOAuth;
// set the consumer key and secret
qoauth->setConsumerKey( "75b3d557c9268c49cfdf041a" );
qoauth->setConsumerSecret( "fd12803fbf0760d34cd2ceb9955199ce" );
// set a timeout for requests (in msecs)
qoauth->setRequestTimeout( 10000 );

// send a request for an unauthorized token
QOAuth::ParamMap reply =
    qoauth->requestToken( "http://example.com/request_token",
                          QOAuth::GET, QOAuth::HMAC_SHA1 );

// if no error occurred, read the received token and token secret
if ( qoauth->error() == QOAuth::NoError ) {
  token = reply.value( QOAuth::ParamToken );
  tokenSecret = reply.value( QOAuth::ParamTokenSecret );
}

The QOAuth::ParamMap is a typedef for QMultiMap<QByteArray,QByteArray>. Everything else should be clear. Similarly, one can request the Access Token (after the previous authorization of the Request Token by User):

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
// if necessary, create a map of additional arguments required by the Service Provider
QOAuth::ParamMap otherArgs;
otherArgs.insert( "misc_arg1", "value1" );
otherArgs.insert( "misc_arg2", "value2" );

// send a request to exchange Request Token for an Access Token
QOAuth::ParamMap reply =
    qoauth->accessToken( "http://example.com/access_token", QOAuth::POST, token,
                         tokenSecret, QOAuth::HMAC_SHA1, otherArgs );

// if no error occurred, read the Access Token (and other arguments, if applicable)
if ( qoauth->error() == QOAuth::NoError ) {
  token = reply.value( QOAuth::ParamToken );
  tokenSecret = reply.value( QOAuth::ParamTokenSecret );
  otherInfo = reply.value( "misc_arg3" );
}

This step ends the OAuth authorization procedure, providing User’s authorized Access Token to be used when requesting further data from server.

Creating OAuth requests

Once authorized, the client application is allowed to access User’s data, each time authenticating itself with User’s Access Token. However, each and every request still has to be signed and encrypted according to OAuth rules. The third method provided by QOAuth library does all the dirty work of signing and encrypting the so called Signature Base String. All you need to do is provide the request parameters. Let’s say that you ask for an image named flower_48.png, of the small size:

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
QByteArray url( "http://example.com/get_photo");
// create a request parameters map
QOAuth::ParamMap map;
map.insert( "file", "flower_48.jpg" );
map.insert( "size", "small" );

// construct the parameters string
QByteArray content =
    qoauth->createParametersString( requestUrl, QOAuth::GET, QOAuth::HMAC_SHA1,
                                    token, tokenSecret, map,
                                    QOAuth::ParseForInlineQuery );
// append parameters string to the URL
url.append( content );
QNetworkRequest request( QUrl( url ) );
// etc...

Just send this request, and receive the photo. Doesn’t seem too complicated, does it? If you like it, you may be interested in much more detailed documentation. Note that this is very preliminary version of the library, and so far it supports only HMAC-SHA1 encryption and may have some problems with GET requests containing percent-encoded data. But it copes well with POST requests, even those with non-ASCII data. After all, it’s mainly POST that is used for transferring wierd data :) Anyway, the work has started just a few days ago, and there’s still a looooot to do.

Where I can get it?

QOAuth’s code is hosted at GitHub. After qmake, make and make install, all you have to do to get QOAuth working, is to append one line to your project file:

CONFIG += oauth

and then include this header in your source:

#include <QtOAuth>

Some binaries will be available soon from qt-apps.org. All the bugs and issues can be reported at QOAuth’s Lighthouseapp bug tracking system.

123 Responses to “Bringing easy OAuth to Qt”

comments feed Subscribe to comments
  1. QPlace Says:

    This is great lib and will be extremely useful! Can you sign me on to the mailing list so I will get the update notifications?

  2. ayoy Says:

    Thanks for the feedback, actually there’s no mailing list yet (and I don’t have your e-mail :) ), but you can track this blog, I’ll be posting updates here.

  3. QPlace Says:

    Isn’t it the part of “leave a reply” submit? I will keep coming back to watch for update.

    Thanks.

  4. ayoy Says:

    It’s not published anywhere, and I don’t have direct access to it. Oh, maybe by hacking blog’s database :P

  5. Suresh Says:

    Have been looking for it for a while, when will it come in official Qt release.? Thanks.

  6. ayoy Says:

    Well, most probably it never will :) It depends on QCA which also isn’t rather going to be a part of Qt. But no fear, I’m going to maintain and develop it if only there are people using it. It’s probable that QOAuth will join Debian distro soon, and it’s already available in Gentoo.

    Thanks for the feedback :)

  7. Gary.W Says:

    good work,I am busy with doing My graduate design ,this’s very useful for My demo.Thanks

  8. nickboy Says:

    hi, ayoy!

    but how can i do it work in windows(vista), please help, ths!

    “After qmake, make and make install, all you have to do to get QOAuth working”

  9. Morrisliang Says:

    So,would you mind providing binary files for windows? I’m kinda stuck with building it from scratch.

  10. Morrisliang Says:

    I finally make it work under windows.

    And I found that the function requestToken() is not so good.Instead of making a local eventloop,you should return a QNetworkReply*,so that we can connect the reply’s signal to a slot.Then the app’s main thread won’t be blocked when calling this function.

  11. Events in Pittsburgh Says:

    Well, most probably it never will :) It depends on QCA which also isn’t rather going to be a part of Qt. But no fear, I’m going to maintain and develop it if only there are people using it. It’s probable that QOAuth will join Debian distro soon, and it’s already available in Gentoo.

  12. Go ped Says:

    And I found that the function requestToken() is not so good.Instead of making a local eventloop,you should return a QNetworkReply*,so that we can connect the reply’s signal to a slot.Then the app’s main thread won’t be blocked when calling this function.

  13. custom spirit tattoos Says:

    I certainly enjoyed the way you explore your experience and knowledge of the subject!

  14. Austin dental Says:

    Such clever work and reporting! Keep up the great works guys I’ve added you guys to my blog roll. This is a great article thanks for sharing this informative information. I will visit your blog regularly for some latest post.

  15. Plano dental Says:

    Clear writing skill which also showing the research you have done on the topics. I am impressed with the discussion also passed a good time here. I am definitely bookmarking this site for better purpose and use.

  16. Preston Smiles Says:

    This is an easy way to retrieve user authorization to protected resources with a built in HTTP server. thanks for clarifying it.

  17. abreuvoirs Says:

    Could you tell me what this course involves and what experience do the trainers have in this field. Thanks.

  18. monicajoy56 Says:

    It is very useful site. i know everyone like this site.

    Scottsdale Custom Home Builders High End Home Builders

  19. monicajoy56 Says:

    This is very important site. It is very useful for me. Fantastic article! I throughly enjoyed your content …very effectively written.

    Scottsdale Custom Home Builders High End Home Builders

  20. tax relief Says:

    tell me what this course involves and what experience do the trainers have in this field. Thanks.

  21. inversion table Says:

    As I mentioned, the point in QOAuth is to be user-friendly, yet powerful. See the code example of obtaining a Request Token form the Service Provider.

  22. long term disability Says:

    Remarkable post and will look forward to your future update. The post is written in very a good manner and it contains much useful information for me. It is pleasing to look you express from the heart and your clarity on this significant content can be easily looked.

  23. thailand Says:

    This was very helpful to me! Thank you very much. Keep the posts coming! klimat thailand lången tips filippinerna

  24. Refurbished Phones Says:

    I can’t believe how little support there is for OAuth in Twitter C++ libraries. This is exactly what I was looking for

  25. Actos Cancer Says:

    Your posts are fairly informational and wordy of attention. But your blog needs little bit of updating. Maybe you should use a smaller mug shot as well.

  26. Qr Code Says:

    I have been surfing on-line more than three hours as of late, yet I never found any fascinating article like yours I’ve desired to write something similar to this on my webpage and this has given me a concept. Cheers.

  27. water damage Pasadena Says:

    Nevertheless imagine if you added some great graphics or videos to give your posts more, “pop”! Your content is excellent but with images and video clips, this site could definitely be one of the greatest in its field. Amazing blog!

  28. accutane lawyers Says:

    i got this blog from my friend name joey and he also like this blog and he also searching for blog which is interesting to read..but for now im gonna call my friend and ask about for this..thanks

  29. junk a car Says:

    I was also searching related stuff from long time.You have solved my problem.Thanks for sharing this great stuff with us.

  30. Transaginal Mesh Lawsuits Says:

    Thank you for posting the great content…I was looking for something like this…I found it quiet interesting, hopefully you will keep posting such blogs….Keep sharing. Transaginal Mesh Lawsuits

  31. Computer Repair Temecula Says:

    By the amount of information in here, I can tell it took a lot of time to write. what do i say about this is?thanks for the blog post.its nice to know about your interesting topic and this is everything for me keep it up.

  32. bankruptcy san diego Says:

    Hey there! A comment here, I just wanted to give a quick shout out and tell you I really enjoy reading your blog posts. Can you suggest any other blogs/websites/forums that deal with the same subjects? Thanks!

  33. stainless steel cookware set Says:

    t it copes well with POST requests, even those with non-ASCII data. After all, it’s mainly POST that is used for transferring wierd data :)

  34. hard anodized cookware set Says:

    That’s how the idea of QOAuth came up.

  35. best miter saw Says:

    Your content is excellent but with images and video clips, this site could definitely be one of the greatest in its field.

  36. Business Directory Says:

    There is a place for future improvements, but I’m terrible lack of free time (or time I can devote to the development QOAuth), so I can not promise anything. If anyone can help me with QOAuth, I would be happy to share the work.

  37. HC aluminium Says:

    I’d prefer to have some friendly, Qt-compatible way to deal with the whole OAuth thing. That’s how the idea of QOAuth came up.

  38. Master Concrete Resurfacing Says:

    The post is written in very a good manner and it contains much useful information for me.

  39. Los Angeles Fencing Says:

    This step ends the OAuth authorization procedure, providing User’s authorized Access Token to be used when requesting further data from server.

  40. parkeren schiphol Says:

    t it copes well with POST requests, even those with non-ASCII data. After all, it’s mainly POST that is used for transferring wierd data.

  41. PPI Refund Says:

    I can tell you that it is the most emotional experience I have had in all my years as a writer. I am so excited to hear what you think.

  42. Memphis Locksmiths Says:

    Terrific job ! Your blog has supplied me the majority of the information I requested . Memphis Locksmiths

  43. wall decals Says:

    After all, it’s mainly POST that is used for transferring wierd data :) Anyway, the work has started just a few days ago, and there’s still a looooot to do.

  44. electricians los angeles Says:

    this was truely a wonderful read. wish more blog were more like this blog. great work. i will follow now.

  45. Seo Says:

    It is pleasing to look you express from the heart and your clarity on this significant content can be easily looked.

  46. Sydney Building Inspections Says:

    It’s probable that QOAuth will join Debian distro soon, and it’s already available in Gentoo.I’m going to maintain and develop it if only there are people using it.

  47. teknik Says:

    Great post! Very helpful. Its about time someone wrote about this stuff online. Cheerswhite beach

  48. 18 wheeler accident attorney Says:

    Neat info. You don’t know how much time you saved me. For the last few weeks I’ve been scouring site after site. I’ve gotten alot of different ideas so it’s a litte hard to filter the worthy from the bad. In any case Have you thougt about putting this info together in an ebook form or something similiar? I’ll bookmark you site and look forward to your reply 18 wheeler accident attorney

  49. yaz recall Says:

    Oh my goodness! an incredible article dude. Thanks Nonetheless I’m experiencing subject with ur rss . Don’t know why Unable to subscribe to it. Is there anybody getting similar rss downside? Anybody who is aware of kindly respond. Thnkx

  50. Elegant wall decals Says:

    If anyone can help me with QOAuth, I would be happy to share the work.

  51. Mold Remediation Says:

    Hi there,Really nice job,There are many people searching about that now they will find enough sources by your tips,Also looking forward for more tips about that

  52. how to become a pilot Says:

    about this topic, I have been lately in your blog once or twice now. I just wanted to say hi and show my thanks for the information provided.

  53. seopositive Says:

    so apart from QtCore it will need QtNetwork module to work. process network requests,

  54. 31 day fat loss cure scam Says:

    I’ve got this page bookmarked now, you have served as a great present and future reference for me, thanks a lot guys…

  55. 31 day fat loss cure scam Says:

    I’ve got this page bookmarked now, you have served as a great present and future reference for me, thanks a lot guys…

  56. Radio luisteren Says:

    it is the best time to make some plans for the future and it is time to be happy. I have read this post and if I could I wish to suggest you some interesting things or suggestions. Perhaps you can write next articles referring to this article. I wish to read even more things about it!

  57. Huawei Pinnacle metro pcs Says:

    even i am a lazy guy like you. I wonder if there is anything more you can do in this oauth scenario..

  58. prozac lawsuit Says:

    The quality is simply wonderful and no doubt you are expert in this area. I would always check out your new entry. Thank you very much and please keep up the good work.

  59. transvaginal mesh lawsuit Says:

    That is a wonderful idea, I am very happy to read this post, and I agree with the opinions of this publication. I think this is the best impression. I am going to do something after reading it.

    transvaginal mesh lawsuit

  60. Pilot license Says:

    I have been learning C for some time now and this is really interesting. Thank you for sharing.

  61. bilverkstad växjö Says:

    This is a good post about qauth. I hope that you will keep on posting stuff like this. Keep up the good work. Thx.

  62. christine23 Says:

    When I started reading this post I learn to navigate things that I really don’t read for a long time. Like this article it really an interesting one.cell phone text message monitoring

  63. game tester job Says:

    I definitely wanted to send a small remark to thank you for these fabulous hints you are posting at this website. My time intensive internet investigation has at the end of the day been recognized with incredibly good insight to exchange with my great friends

  64. Norgain Says:

    Your site is good Actually, i have seen your post and That was very informative and very entertaining for me. Thanks for posting Really Such Things. I should recommend your site to my friends.ipad 3

  65. Los Angeles employment lawyer Says:

    I wanted to drop you a quick note to express my thanks as I have enjoyed the way you’ve structured your site which is very nice one and gives in depth information. I think it will be helpful for me as well

  66. laguna beach real estate Says:

    This is undeniably one of the most fascinating blogs I have seen. It’s so painless to tune out, but there’s really some first class material online, and I believe your place is one of the few!

  67. Propecia Lawsuit Says:

    Can I just say how nice it is to find someone who actually knows what they’re speaking about on the web. More people need to read this post and understand this. I’m amazed that this site is not more popualar.

  68. Blood Clot Filters Says:

    I’m not much of that specialized to web pages however I know what’s professional to view the minute I saw one. I possibly could consider the information of your page as an newsy as well as effective resource for information and facts.

  69. IVC Filter Says:

    It is my great pleasure to look at your site and to enjoy your great posts here. I like it very much. I know that you put much attention for these articles, as all of them make sense and are very useful !

  70. santa barbara real estate Says:

    I figured about starting my very own blog too but I’m just too lazy so, I guess I will just have to maintain checking yours out.

  71. huntington beach real estate Says:

    I do not real have a large deal to say in retort I just wanted to comment to tell well done. marvelous post. i never thought of that.

  72. Lawyers for Transvaginal Mesh Says:

    This is great information. Didn’t find any other source other then your site and github with this information. Thanks for sharing. This is going to be great for my optimization. Btw, anyone here used kQOAuth, any thoughts on that? Thanks.

  73. bateau occasion Says:

    Your online website came up in my analysis and I’m prompted by what you may have composed on this theme. I’m currently branching out my enquiry and thus can not contribute further, however, I’ve bookmarked your site and shall be returning to maintain up with any future updates. Just enjoy it and thanks for permitting my remark.

  74. carpet cleaning Says:

    I found your website perfect for my needs. It contains wonderful and helpful posts. I have read most of them and got a lot from them. To me, you are doing the greReally i am impressed from this post.

  75. joe hughes Says:

    Thanks for such a great QOAuth tutorial here. I was searching for something like that for quite a long time and at last I have found it here.

  76. austin bible church Says:

    This is really stunning work.I have read your article and to me it is awesome.Thanks for this sort of work down here.Hope to see some update here.

  77. latest news today Says:

    Excellent post. I want to thank you for this informative read, I really appreciate sharing this great post. Keep up your work. Thanks for this very useful info you have provided us.

  78. linkboostup Says:

    You must be aware that you really have an awesome site. Does exactly what it sets out to do. Stimulating me to read much more of your post. Hope to see a lot more excellent posts from you shortly. Keep it up buddy.

  79. bảo vệ Says:

    Nell’ umana ricerca di qualcuno da ammirare, di solito non è necessario percorrere grandi distanze, nè nel tempo, nè nello spazio

  80. web design Hertfordshire Says:

    I found the quality contents here.

  81. thanh lap doanh nghiep Says:

    Excellent post. I want to thank you for this informative read, I really appreciate sharing this great post. Keep up your work. Thanks for this very useful info you have provided us.

  82. thanh lap cty Says:

    I want to thank you for this informative read, I really appreciate sharing this great post. Keep up your work.

  83. thành lập doanh nghiệp Says:

    Thanks for this very useful info you have provided us.

  84. dich vu ke toan Says:

    Nell’ umana ricerca di qualcuno da ammirare, di solito non è necessario percorrere grandi distanze, nè nel tempo, nè nello spazio

  85. dịch vụ kế toán Says:

    You must be aware that you really have an awesome site. Does exactly what it sets out to do. Stimulating me to read much more of your post. Hope to see a lot more excellent posts from you shortly. Keep it up buddy.

  86. bao cao thue Says:

    I’m currently branching out my enquiry and thus can not contribute further, however, I’ve bookmarked your site and shall be returning to maintain up with any future updates. Just enjoy it and thanks for permitting my remark.

  87. báo cáo thuế Says:

    Your online website came up in my analysis and I’m prompted by what you may have composed on this theme. I’m currently branching out my enquiry and thus can not contribute further, however, I’ve bookmarked your site and shall be returning to maintain up with any future updates. Just enjoy it and thanks for permitting my remark.

  88. tu van thanh lap cong ty Says:

    I wanted to drop you a quick note to express my thanks as I have enjoyed the way you’ve structured your site which is very nice one and gives in depth information. I think it will be helpful for me as well

  89. thành lập công ty Says:

    This is undeniably one of the most fascinating blogs I have seen. It’s so painless to tune out, but there’s really some first class material online, and I believe your place is one of the few!

  90. thanh lap cong ty tnhh Says:

    Can I just say how nice it is to find someone who actually knows what they’re speaking about on the web. More people need to read this post and understand this. I’m amazed that this site is not more popualar.

  91. Dịch vụ thành lập công ty Says:

    I’m currently branching out my enquiry and thus can not contribute further, however, I’ve bookmarked your site and shall be returning to maintain up with any future updates. Just enjoy it and thanks for permitting my remark.

  92. Dich vu thanh lap cong ty Says:

    Does exactly what it sets out to do. Stimulating me to read much more of your post. Hope to see a lot more excellent posts from you shortly. Keep it up buddy.

  93. Dịch vụ thành lập doanh nghiệp Says:

    I’m currently branching out my enquiry and thus can not contribute further, however, I’ve bookmarked your site and shall be returning to maintain up with any future updates. Just enjoy it and thanks for permitting my remark.

  94. dich vu thanh lap doanh nghiep Says:

    I found your website perfect for my needs. It contains wonderful and helpful posts. I have read most of them and got a lot from them. To me, you are doing the greReally i am impressed from this post.

  95. cach thanh lap cong ty Says:

    Nell’ umana ricerca di qualcuno da ammirare, di solito non è necessario percorrere grandi distanze, nè nel tempo, nè nello spazio

  96. qui trinh thanh lap cong ty Says:

    I’m currently branching out my enquiry and thus can not contribute further

  97. seo Says:

    Die Namensgebung ist aber nicht ohne Fallstricke. Ein paar der Probleme, auf die ihr acht geben solltet sind:

  98. gold price per ounce Says:

    You are so talented in writing. God is really using you in tremendous methods. You are doing a great job! This was a wonderful article.Thank you

  99. latest news today Says:

    The most people wrote about this subject with the eloquence that you just did, I’m sure people would do much more than just read, they act. Great stuff here. Please keep it up..

  100. tperdalcar Says:

    Die Namensgebung ist aber nicht ohne Fallstricke. Ein paar der Probleme, auf die ihr acht geben solltet sind: s

  101. medical billing and coding training Says:

    you’re not familiar with OAuth, you better start here).

  102. Digital Marketing Agency Orlando Says:

    to empower you with more knowledge on tweaking the most out of your Mac.

  103. Yaz lawyer Says:

    I enjoy some of content in the post.. please keep it up..thanks

  104. dribbble invite Says:

    a lot of useful information that could come handy in our future. immediately after I put the server up. nice thanks

  105. Online Shopping in BD Says:

    I was in real need of such a site.I am greatly helped by this site as I always get inspirational and instructional post here.Thanks for taking the time to converse all of this.Go along such way.

  106. aidenmoor Says:

    I found this blog great, All the information given in this blog are very informative and appealing!

  107. Sold Out Events Says:

    I’d prefer to have some friendly, Qt-compatible way to deal with the whole OAuth thing. That’s how the idea of QOAuth came up.

  108. Customized Essays Says:

    lives or even keep a diary. Writing about yourself is never easy, and you may find yourself freezing up in front of the computer screen or becoming stilted and unnecessarily verbose.

    Here are a few suggestions you can use to develop your own voice and style for your

  109. cleaning service dayton Says:

    Been reading a lot from your blog and I’m quite interested in the contents that you’re providing your loyal readers. Thanks!

  110. banking jobs uk Says:

    I did gone to a lot of web page in the past weeks still this blog strucked me the most. The issue was so enchanting.

  111. Greg Says:

    This is my first opportunity to visit this website. I found some interesting things and I will apply to the development of my blog. Thanks for sharing useful information.

  112. house design Says:

    I was hunting for the most impressive house design when I luckily uncovered this website. It’s extremely impressive.

  113. lesnar vs overeem Says:

    Men ardently pursue truth, assuming it will be angels’ bread when found.

  114. gold price Says:

    This is a focused topic featured. It’s quite fantastic reading content. You’ve enhanced my interests and it also took me in deep thinking. Wonderful job!

  115. tv guide Says:

    Is like this topic! good thing that you share news about this stuff to the rest of us! cherrio!

  116. boxweddingdress Says:

    http://www.boxweddingdress.net/ boxweddingdress

  117. represent Says:

    string from given parameters.

    First two methods serve application authorization purposes, whilst the othe

  118. Indian Takeaway Says:

    Thanks for taking the time to converse all of this.Go along such way. I am greatly helped by this site as I always get inspirational and instructional post here.

  119. Forfait mobile Says:

    This is my first opportunity to visit this website. I found some interesting things and I will apply to the development of my blog. Thanks for sharing useful information

  120. parkeren schiphol Says:

    Really nice site. very useful for me!

  121. Sinonimi Contrari Says:

    Nice infos! I will be back soon

  122. accounting firm los angeles Says:

    you do not need to visit a physical casino when you can access casinos online and win money.Chicago cleaning service »

  123. houston dentist Says:

    This one has got my sight by the quality of the work and for it nice tittle.Thanks for the great sharing with the great clearance.Hope to find some more update here.Keep it up here.

Leave a Reply