Changeset 460:8503f91a8af9 in SMSSender
- Timestamp:
- Jan 5, 2015 1:36:06 PM (8 years ago)
- Branch:
- new-gtwy-coopmobile
- Location:
- gateways/CoopMobile
- Files:
-
- 1 added
- 3 deleted
- 14 edited
Legend:
- Unmodified
- Added
- Removed
-
gateways/CoopMobile/business/account.cpp
r454 r460 1 1 /* 2 2 Coop Mobile gateway plugin - The smssender plugin for the Coop Mobile platform. 3 Copyright (C) 201 1-2014, gorrión. See http://smssender.gorrion.ch3 Copyright (C) 2014-2015, gorrión. See http://smssender.gorrion.ch 4 4 5 5 This program is free software: you can redistribute it and/or modify … … 38 38 , m_httpHelper(new SNetworkHelper) 39 39 { 40 m_httpHelper->addTrustedCA(":/certs/Verisign_class3_root.crt"); 41 m_httpHelper->addTrustedCA(":/certs/VerisignCA_G3.crt"); 42 m_httpHelper->addTrustedCA(":/certs/VerisignCA_G5.crt"); 40 m_httpHelper->addTrustedCA(":/certs/EquifaxSecureCA.crt"); 43 41 44 42 connect(this, SIGNAL(initStateChanged(IAccount*)), … … 68 66 69 67 68 QStringList Account::divideMessageIntoShortSMS(const QString &message) const { 69 return ((MessageDivider *)messageDivider()) 70 ->divideMessageIntoShortSMS(message); 71 } 72 70 73 SNetworkHelper *Account::httpHelper() const { 71 74 return m_httpHelper.data(); … … 76 79 77 80 SNetworkReply reply; 78 STATUS_RETURN_IF_ERROR(httpHelper()->syncGet( QString("TODO"), &reply));81 STATUS_RETURN_IF_ERROR(httpHelper()->syncGet(Gateway::URL_SEND_SMS, &reply)); 79 82 80 QString html = reply->readAll(); 81 // TODO: Check if we are at https://sso.post.ch/NO_SERVICE 82 *loggedIn = html.contains("Error", Qt::CaseSensitive); 83 QString html = QString::fromUtf8(reply->readAll()); 84 *loggedIn = !html.contains("<span>Login</span>", Qt::CaseSensitive); 83 85 84 86 qDebug() << "Ended still-logged-in-check"; … … 88 90 util::Status Account::reloadOnlineParams() { 89 91 SNetworkReply reply; 90 STATUS_RETURN_IF_ERROR(httpHelper()->syncGet( QString("TODO"), &reply));92 STATUS_RETURN_IF_ERROR(httpHelper()->syncGet(Gateway::URL_SEND_SMS, &reply)); 91 93 92 QString html = reply->readAll();94 QString html = QString::fromUtf8(reply->readAll()); 93 95 return reloadOnlineParams(html); 94 96 } … … 99 101 } 100 102 util::Status Account::reloadFreeSMSCount(QString html) { 101 /* <td class="label">50 von 50 TextSMS im Monat xxx</td>*/103 /* SMS Status: noch verfügbar - 146 SMS */ 102 104 103 QRegExp rx( "TextSMS-Kontingent von \\d+ SMS verbraucht!");105 QRegExp rx(QString::fromUtf8("SMS Status: noch verfügbar - (\\d+) SMS")); 104 106 rx.setCaseSensitivity(Qt::CaseInsensitive); 105 if (rx.indexIn(html) != -1) { 106 setFreeSMSCount(0); 107 } else { 108 rx.setPattern("<td class=\"label\">(\\d+) von \\d+ TextSMS im Monat [a-zA-Zäöü]+</td>"); 109 if (rx.indexIn(html) == -1) { 110 return util::StatusParseError("Could not get the free sms count.", 111 html); 112 } 113 setFreeSMSCount(rx.cap(1).toInt()); 107 if (rx.indexIn(html) == -1) { 108 return util::StatusParseError("Could not get the free sms count.", 109 html); 114 110 } 111 112 setFreeSMSCount(rx.cap(1).toInt()); 115 113 qDebug() << " Free SMS count: " + rx.cap(1); 116 114 -
gateways/CoopMobile/business/account.h
r454 r460 1 1 /* 2 2 Coop Mobile gateway plugin - The smssender plugin for the Coop Mobile platform. 3 Copyright (C) 201 1-2014, gorrión. See http://smssender.gorrion.ch3 Copyright (C) 2014-2015, gorrión. See http://smssender.gorrion.ch 4 4 5 5 This program is free software: you can redistribute it and/or modify … … 41 41 42 42 public: 43 QStringList divideMessageIntoShortSMS(const QString &message) const; 43 44 SNetworkHelper *httpHelper() const; 44 45 … … 56 57 public: 57 58 QStringList divideMessageIntoLongSMS(const QString &message) const; 59 QStringList divideMessageIntoShortSMS(const QString &message) const; 58 60 int costsForMessage(const QString &message) const; 59 61 -
gateways/CoopMobile/business/account_costs.cpp
r458 r460 1 1 /* 2 2 Coop Mobile gateway plugin - The smssender plugin for the Coop Mobile platform. 3 Copyright (C) 201 1-2015, gorrión. See http://smssender.gorrion.ch3 Copyright (C) 2014-2015, gorrión. See http://smssender.gorrion.ch 4 4 5 5 This program is free software: you can redistribute it and/or modify … … 20 20 #include "math.h" 21 21 22 #include "gateways/CoopMobile/business/gateway.h" 23 22 24 namespace CoopMobile { 23 25 … … 26 28 // - http://coop.nth.ch/index/login/lang/de 27 29 // - http://coop.nth.ch/scripts/sms_counter_validator.js 28 29 static const unsigned NUM_SHORT_SMS_PER_LONG_SMS = 5;30 30 31 31 struct MaxCount { … … 57 57 message.remove('\r'); 58 58 59 // Adds "\n." to the end of the message if it is not already there to bring 60 // the forced suffix on a new line. 61 if (!message.endsWith("\n.")) { 62 if (!message.endsWith("\n")) { 63 message = message + '\n'; 64 } 65 message = message + '.'; 66 } 67 68 59 69 const bool messageContainsSpecialChars = hasSpecialChars( 60 70 message, QString("\r\n") + GSM_CHARS + GSM_DOUBLE_PRICE_CHARS); … … 66 76 : GSM_DOUBLE_PRICE_CHARS; 67 77 const unsigned maxLongSMSSize = 68 maxCount->_long * NUM_SHORT_SMS_PER_LONG_SMS;78 maxCount->_long * Gateway::NUM_SHORT_SMS_PER_LONG_SMS; 69 79 70 unsigned lastLongSMSLength; 71 QStringList longSMS = BaseMessageDivider::divideMessageIntoLongSMS( 72 message, maxLongSMSSize, doublePriceChars, &lastLongSMSLength); 80 // Calculates the costs. 81 if (costs) { 82 unsigned lastLongSMSLength; 83 QStringList longSMS = BaseMessageDivider::divideMessageIntoLongSMS( 84 message + FORCED_MESSAGE_SUFFIX, maxLongSMSSize, 85 doublePriceChars, &lastLongSMSLength); 73 86 74 if (costs) { 75 *costs = (longSMS.size() - 1) * NUM_SHORT_SMS_PER_LONG_SMS; 87 *costs = (longSMS.size() - 1) * Gateway::NUM_SHORT_SMS_PER_LONG_SMS; 76 88 if (lastLongSMSLength > maxCount->_short) { 77 89 *costs += ceil(lastLongSMSLength / (double)maxCount->_long); … … 81 93 } 82 94 95 // Splits the text. 96 QStringList longSMS = BaseMessageDivider::divideMessageIntoLongSMS( 97 message, maxLongSMSSize - FORCED_MESSAGE_SUFFIX.length(), 98 doublePriceChars, NULL); 83 99 return longSMS; 84 100 } … … 89 105 } 90 106 107 QStringList Account::MessageDivider::divideMessageIntoShortSMS( 108 const QString &m) const { 109 QString message = m; 110 message.remove('\r'); 111 112 const bool messageContainsSpecialChars = hasSpecialChars( 113 message, QString("\r\n") + GSM_CHARS + GSM_DOUBLE_PRICE_CHARS); 114 const MaxCount *maxCount = messageContainsSpecialChars 115 ? &SPECIAL_MAX_COUNT 116 : &DEFAULT_MAX_COUNT; 117 const QString doublePriceChars = messageContainsSpecialChars 118 ? "" 119 : GSM_DOUBLE_PRICE_CHARS; 120 const unsigned maxShortSMSSize = maxCount->_long; 121 122 QStringList shortSMS = BaseMessageDivider::divideMessageIntoLongSMS( 123 message, maxShortSMSSize, doublePriceChars, NULL); 124 125 return shortSMS; 126 } 127 91 128 int Account::MessageDivider::costsForMessage(const QString &message) const { 92 129 int costs; 93 divideMessageIntoLongSMS(message + FORCED_MESSAGE_SUFFIX, &costs);130 divideMessageIntoLongSMS(message, &costs); 94 131 return costs; 95 132 } -
gateways/CoopMobile/business/account_task_login.cpp
r454 r460 1 1 /* 2 2 Coop Mobile gateway plugin - The smssender plugin for the Coop Mobile platform. 3 Copyright (C) 201 1-2014, gorrión. See http://smssender.gorrion.ch3 Copyright (C) 2014-2015, gorrión. See http://smssender.gorrion.ch 4 4 5 5 This program is free software: you can redistribute it and/or modify … … 45 45 if (rx.indexIn(html) != -1) { 46 46 QString error = SNetworkHelper::htmldecodeString(rx.cap(1).trimmed()); 47 return error == "Benutzername ist ungültig."||48 error == "Passwort ist ungültig."47 return error == QString::fromUtf8("Benutzername ist ungültig.") || 48 error == QString::fromUtf8("Passwort ist ungültig.") 49 49 ? util::StatusPermissionDenied("Invalid username/password.") 50 50 : util::StatusUnknown(error); … … 58 58 } 59 59 60 util::Status AccountLoginTask::postLogin() {61 SNetworkReply reply;62 STATUS_RETURN_IF_ERROR(httpHelper()->syncGet(Gateway::URL_LOGIN, &reply));63 m_lastHtml = reply->readAll();64 65 QList<IParam*> posts;66 posts.append(new SKeyValueParam(67 "isiwebuserid", account()->username().toUtf8()));68 posts.append(new SKeyValueParam(69 "isiwebpasswd", account()->password().toUtf8()));70 posts.append(new SKeyValueParam("checkIsSubmitted", "fromFormLoginhtml"));71 72 STATUS_RETURN_IF_ERROR(httpHelper()->syncPost(Gateway::URL_LOGIN, posts,73 &reply));74 m_lastHtml = reply->readAll();75 76 // Check for login error77 QRegExp rx("<div class=\"errorBoxMessage\">\\s*([^\\n]+)\\s*</div>");78 if (rx.indexIn(m_lastHtml) > -1) {79 return util::StatusPermissionDenied("Invalid userdata.")80 .addDebugInfo(httpHelper()->htmldecodeString(rx.cap(1)));81 }82 83 return util::StatusOk();84 }85 86 util::Status AccountLoginTask::postSamlRequest() {87 S_ASSERT(!m_lastHtml.isEmpty());88 89 /* Find URL */90 QRegExp rx("<form.*action=\"([^\"]+)\".*>");91 rx.setMinimal(true);92 if (rx.indexIn(m_lastHtml) == -1) {93 return util::StatusParseError("Coult not find the POST url.",94 m_lastHtml);95 }96 QString url = rx.cap(1);97 98 /* Find SAMLResponse */99 rx.setPattern("<input type=\"hidden\" name=\"SAMLRequest\" value=\"([^\"]+)\" />");100 if (rx.indexIn(m_lastHtml) == -1) {101 return util::StatusParseError("Could not find the SAMLRequest field.",102 m_lastHtml);103 }104 QString samlRequest = rx.cap(1);105 106 /* Find RelayState */107 rx.setPattern("<input type=\"hidden\" name=\"RelayState\" value=\"([^\"]+)\" />");108 if (rx.indexIn(m_lastHtml) == -1) {109 return util::StatusParseError("Could not find the RelayState field.",110 m_lastHtml);111 }112 QString relayState = rx.cap(1);113 114 115 // Post the saml request116 QList<IParam*> posts;117 posts.append(new SKeyValueParam("SAMLRequest", samlRequest.toUtf8()));118 posts.append(new SKeyValueParam("RelayState", relayState.toUtf8()));119 120 SNetworkReply reply;121 STATUS_RETURN_IF_ERROR(httpHelper()->syncPost(url, posts, &reply));122 m_lastHtml = reply->readAll();123 124 return util::StatusOk();125 }126 127 util::Status AccountLoginTask::postSamlResponse() {128 S_ASSERT(!m_lastHtml.isEmpty());129 130 /*131 <form id="saml_form" action="https://organizer.sso.post.ch/sso-navi/assertion_consumer.php" method="POST" enctype="application/x-www-form-urlencoded">132 <input type="hidden" name="SAMLResponse" value="PHA6UmVzcG9u..."/>133 <input id="submit_saml" type="submit" value="Go"/>134 <input type="hidden" name="RelayState" value="https://postsso-int.daybyday.de/sso-navi/assertion_consumer.php"/></form></div>135 */136 /* Find URL */137 QRegExp rx("<form.*action=\"([^\"]+)\".*");138 rx.setMinimal(true);139 if (rx.indexIn(m_lastHtml) == -1) {140 return util::StatusParseError("Could not find the POST url.",141 m_lastHtml);142 }143 QString url = rx.cap(1);144 145 /* Find SAMLResponse */146 rx.setPattern("<input type=\"hidden\" name=\"SAMLResponse\" value=\"([^\"]+)\"/>");147 if (rx.indexIn(m_lastHtml) == -1) {148 return util::StatusParseError("Could not find the SAMLResquest field.",149 m_lastHtml);150 }151 QString samlRequest = rx.cap(1);152 153 /* Find RelayState */154 rx.setPattern("<input type=\"hidden\" name=\"RelayState\" value=\"([^\"]+)\"/>");155 if (rx.indexIn(m_lastHtml) == -1) {156 return util::StatusParseError("Could not find the RelayState field.",157 m_lastHtml);158 }159 QString relayState = rx.cap(1);160 161 162 // Post the saml response163 QList<IParam*> posts;164 posts.append(new SKeyValueParam("SAMLResponse", samlRequest.toUtf8()));165 posts.append(new SKeyValueParam("RelayState", relayState.toUtf8()));166 167 SNetworkReply reply;168 STATUS_RETURN_IF_ERROR(httpHelper()->syncPost(url, posts, &reply));169 m_lastHtml = reply->readAll();170 171 return util::StatusOk();172 }173 174 175 60 Account *AccountLoginTask::account() const { 176 61 return static_cast<Account*>(BaseAccountLoginTask::account()); -
gateways/CoopMobile/business/account_task_sendsms.cpp
r454 r460 1 1 /* 2 2 Coop Mobile gateway plugin - The smssender plugin for the Coop Mobile platform. 3 Copyright (C) 201 1-2014, gorrión. See http://smssender.gorrion.ch3 Copyright (C) 2014-2015, gorrión. See http://smssender.gorrion.ch 4 4 5 5 This program is free software: you can redistribute it and/or modify … … 39 39 40 40 qDebug() << "Start sending SMS"; 41 account()->reloadOnlineParams() ;41 account()->reloadOnlineParams().ignoreError(); // TODO: Should we really ignore it? 42 42 util::Status smsStatus = doDoSendSMS(); 43 account()->reloadOnlineParams() ;43 account()->reloadOnlineParams().ignoreError(); 44 44 qDebug() << "SMS has been sent"; 45 45 setProgress(100); … … 64 64 // Generate recipients string 65 65 setDetails(Action::AddingRecipients); 66 QString recipientsStr;67 int recipientsCount = 0;68 while (i.hasNext() &&69 (recipientsCount < Gateway::MAX_RECIPIENTS_PER_SMS)) {70 addRecipient(*i.next(), &recipientsStr);71 ++recipientsCount;72 }73 74 if (isCancelled()) return util::StatusCanceled("");75 66 76 67 // Send the message 77 68 setDetails(Action::SendingSMS); 78 STATUS_RETURN_IF_ERROR(sendLongSMS( recipientsStr, msgPart));69 STATUS_RETURN_IF_ERROR(sendLongSMS(&i, msgPart)); 79 70 80 71 setProgress(progress() + percent_per_sms); … … 85 76 } 86 77 87 void SMSSendTask::addRecipient(const SContact &recipient, 88 QString *recipientsStr) const { 89 if (!recipientsStr->isEmpty()) { 90 *recipientsStr += ","; 91 } 92 *recipientsStr += recipient.number().toString("aaau"); 93 } 94 util::Status SMSSendTask::sendLongSMS(const QString &recipientsStr, 95 const QString &text) { 78 util::Status SMSSendTask::sendLongSMS( 79 QSetIterator<const SContact *> *recipientsIt, const QString &text) { 96 80 qDebug() << "Start of sending part of SMS"; 97 81 82 /* POST: 83 info_count 1 84 info_msg_0 sms text 85 info_msg_1 86 info_msg_2 87 info_msg_3 88 info_msg_4 89 schedule_sms NORMAL 90 schedule_sms_time 23.12.2014 14:50 91 sendto[] 92 sendto[] 0791234567 93 sendto[] 0761234567 94 sms_text sms text 95 */ 96 98 97 QList<IParam*> posts; 99 posts.append(new SKeyValueParam("my_action", "sms")); 100 posts.append(new SKeyValueParam("draft_id", "")); 101 posts.append(new SKeyValueParam("later_id", "")); 102 posts.append(new SKeyValueParam("sms_number", recipientsStr.toUtf8())); 103 posts.append(new SKeyValueParam("sms_body", text.toUtf8())); 98 posts.append(new SKeyValueParam("schedule_sms", "NORMAL")); 99 posts.append(new SKeyValueParam( 100 "schedule_sms_time", 101 QDateTime::currentDateTime().toString("dd.MM.yyyy hh:mm") 102 .toUtf8())); 103 104 // Adds the recipients. 105 int recipientsCount = 0; 106 posts.append(new SKeyValueParam("sendto[]", "")); 107 while (recipientsIt->hasNext() && 108 (recipientsCount < Gateway::MAX_RECIPIENTS_PER_SMS)) { 109 const SNumber &recipient = recipientsIt->next()->number(); 110 ++recipientsCount; 111 112 posts.append(new SKeyValueParam("sendto[]", 113 recipient.toString("aaau").toUtf8())); 114 } 115 116 // Adds the SMS text. 117 posts.append(new SKeyValueParam("sms_text", text.toUtf8())); 118 119 int info_count = account()->costsForMessage(text); 120 S_ASSERT(info_count > 0 && info_count <= Gateway::NUM_SHORT_SMS_PER_LONG_SMS); 121 posts.append(new SKeyValueParam("info_count", 122 QString::number(info_count).toUtf8())); 123 124 QStringList shortSMSList = account()->divideMessageIntoShortSMS(text); 125 for (int i = 0; i < Gateway::NUM_SHORT_SMS_PER_LONG_SMS; ++i) { 126 const QString &key = QString("info_msg_%1").arg(i); 127 const QString &value = i < shortSMSList.count() 128 ? shortSMSList[i].replace('\n', "\\n") 129 : ""; 130 posts.append(new SKeyValueParam(key.toUtf8(), value.toUtf8())); 131 } 104 132 105 133 SNetworkReply reply; 106 134 STATUS_RETURN_IF_ERROR(httpHelper()->syncPost( 107 QString("TODO: Gateway::URL_SENDSMS"), posts,108 &reply,SNetworkHelper::ptUrlEncoded));135 Gateway::URL_SEND_SMS, posts, &reply, 136 SNetworkHelper::ptUrlEncoded)); 109 137 QString response = QString::fromUtf8(reply->readAll()); 110 138 111 139 // Check for error responses 112 // <script>alert('E 03-005: Es trat ein Fehler beim Versenden auf. 113 // Folgende Nachrichten konnten nicht versendet werden:\n\n- 0041791111111'); 114 // </script> 115 QRegExp rx("<script>alert\\('(E \\d{2}-\\d{3}:[^']+)", Qt::CaseInsensitive); 140 // <div class="error-item">Ihre SMS ist leer</div> 141 // <div class="error-item">Bitte Nummer des Empfängers eingeben</div> 142 QRegExp rx("<div class=\"error-item\">[^<]", Qt::CaseInsensitive); 116 143 if (response.indexOf(rx) > -1) { 117 return util::StatusUnknown(rx.cap(1)); 144 return util::StatusUnknown(rx.cap(1)); // Only considers the first error 118 145 } 119 146 -
gateways/CoopMobile/business/account_tasks.h
r454 r460 1 1 /* 2 2 Coop Mobile gateway plugin - The smssender plugin for the Coop Mobile platform. 3 Copyright (C) 201 1-2014, gorrión. See http://smssender.gorrion.ch3 Copyright (C) 2014-2015, gorrión. See http://smssender.gorrion.ch 4 4 5 5 This program is free software: you can redistribute it and/or modify … … 36 36 private: 37 37 SNetworkHelper *httpHelper() const; 38 39 private:40 util::Status postLogin() MUST_USE_RESULT;41 util::Status postSamlRequest() MUST_USE_RESULT;42 util::Status postSamlResponse() MUST_USE_RESULT;43 44 QByteArray m_lastHtml;45 38 }; 46 39 … … 59 52 private: 60 53 util::Status doDoSendSMS() MUST_USE_RESULT; 61 void addRecipient(const SContact &recipient, QString *recipientsStr) const; 62 util::Status sendLongSMS(const QString &recipientsStr, 54 util::Status sendLongSMS(QSetIterator<const SContact *> *recipientsIt, 63 55 const QString &text) MUST_USE_RESULT; 64 56 -
gateways/CoopMobile/business/gateway.cpp
r454 r460 1 1 /* 2 2 Coop Mobile gateway plugin - The smssender plugin for the Coop Mobile platform. 3 Copyright (C) 201 1-2014, gorrión. See http://smssender.gorrion.ch3 Copyright (C) 2014-2015, gorrión. See http://smssender.gorrion.ch 4 4 5 5 This program is free software: you can redistribute it and/or modify … … 22 22 namespace CoopMobile { 23 23 24 const QString Gateway::URL_LOGIN = "http://coop.nth.ch/index/login/lang/de"; 24 const QString Gateway::URL_LOGIN = "https://coop.nth.ch/index/login/lang/de"; 25 const QString Gateway::URL_SEND_SMS = "https://coop.nth.ch/smsbox/smsedit/lang/de"; 25 26 const short Gateway::MAX_RECIPIENTS_PER_SMS = 10; 27 const short Gateway::NUM_SHORT_SMS_PER_LONG_SMS = 5; 28 26 29 27 30 QString Gateway::name() const { -
gateways/CoopMobile/business/gateway.h
r454 r460 1 1 /* 2 2 Coop Mobile gateway plugin - The smssender plugin for the Coop Mobile platform. 3 Copyright (C) 201 1-2014, gorrión. See http://smssender.gorrion.ch3 Copyright (C) 2014-2015, gorrión. See http://smssender.gorrion.ch 4 4 5 5 This program is free software: you can redistribute it and/or modify … … 34 34 public: /* IGateway */ 35 35 static const QString URL_LOGIN; 36 static const QString URL_SEND_SMS; 36 37 static const short MAX_RECIPIENTS_PER_SMS; 38 static const short NUM_SHORT_SMS_PER_LONG_SMS; 37 39 38 40 QString name() const; -
gateways/CoopMobile/gui/business/gateway_gui.cpp
r454 r460 1 1 /* 2 2 Coop Mobile gateway plugin - The smssender plugin for the Coop Mobile platform. 3 Copyright (C) 201 1-2014, gorrión. See http://smssender.gorrion.ch3 Copyright (C) 2014-2015, gorrión. See http://smssender.gorrion.ch 4 4 5 5 This program is free software: you can redistribute it and/or modify -
gateways/CoopMobile/gui/coopmobile.cpp
r454 r460 1 1 /* 2 2 Coop Mobile gateway plugin - The smssender plugin for the Coop Mobile platform. 3 Copyright (C) 201 1-2014, gorrión. See http://smssender.gorrion.ch3 Copyright (C) 2014-2015, gorrión. See http://smssender.gorrion.ch 4 4 5 5 This program is free software: you can redistribute it and/or modify -
gateways/CoopMobile/gui/coopmobile.h
r454 r460 1 1 /* 2 2 Coop Mobile gateway plugin - The smssender plugin for the Coop Mobile platform. 3 Copyright (C) 201 1-2014, gorrión. See http://smssender.gorrion.ch3 Copyright (C) 2014-2015, gorrión. See http://smssender.gorrion.ch 4 4 5 5 This program is free software: you can redistribute it and/or modify -
gateways/CoopMobile/gui/ui/settingswidget.cpp
r454 r460 1 1 /* 2 2 Coop Mobile gateway plugin - The smssender plugin for the Coop Mobile platform. 3 Copyright (C) 201 1-2014, gorrión. See http://smssender.gorrion.ch3 Copyright (C) 2014-2015, gorrión. See http://smssender.gorrion.ch 4 4 5 5 This program is free software: you can redistribute it and/or modify -
gateways/CoopMobile/gui/ui/settingswidget.h
r454 r460 1 1 /* 2 2 Coop Mobile gateway plugin - The smssender plugin for the Coop Mobile platform. 3 Copyright (C) 201 1-2014, gorrión. See http://smssender.gorrion.ch3 Copyright (C) 2014-2015, gorrión. See http://smssender.gorrion.ch 4 4 5 5 This program is free software: you can redistribute it and/or modify -
gateways/CoopMobile/lib/coopmobile.qrc
r454 r460 1 1 <RCC> 2 2 <qresource prefix="/certs"> 3 <file>Verisign_class3_root.crt</file> 4 <file>VerisignCA_G3.crt</file> 5 <file>VerisignCA_G5.crt</file> 3 <file>EquifaxSecureCA.crt</file> 6 4 </qresource> 7 5 <qresource prefix="/locale">
Note: See TracChangeset
for help on using the changeset viewer.