Changeset 460:8503f91a8af9 in SMSSender


Ignore:
Timestamp:
Jan 5, 2015 1:36:06 PM (4 years ago)
Author:
Sämy Zehnder <saemy.zehnder@…>
Branch:
new-gtwy-coopmobile
Message:

Logging in and sending messages via the CoopMobile? gateway is now possible.

Location:
gateways/CoopMobile
Files:
1 added
3 deleted
14 edited

Legend:

Unmodified
Added
Removed
  • gateways/CoopMobile/business/account.cpp

    r454 r460  
    11/*
    22  Coop Mobile gateway plugin - The smssender plugin for the Coop Mobile platform.
    3   Copyright (C) 2011-2014, gorrión. See http://smssender.gorrion.ch
     3  Copyright (C) 2014-2015, gorrión. See http://smssender.gorrion.ch
    44
    55  This program is free software: you can redistribute it and/or modify
     
    3838    , m_httpHelper(new SNetworkHelper)
    3939{
    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");
    4341
    4442    connect(this, SIGNAL(initStateChanged(IAccount*)),
     
    6866
    6967
     68QStringList Account::divideMessageIntoShortSMS(const QString &message) const {
     69    return ((MessageDivider *)messageDivider())
     70            ->divideMessageIntoShortSMS(message);
     71}
     72
    7073SNetworkHelper *Account::httpHelper() const {
    7174    return m_httpHelper.data();
     
    7679
    7780    SNetworkReply reply;
    78     STATUS_RETURN_IF_ERROR(httpHelper()->syncGet(QString("TODO"), &reply));
     81    STATUS_RETURN_IF_ERROR(httpHelper()->syncGet(Gateway::URL_SEND_SMS, &reply));
    7982
    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);
    8385
    8486    qDebug() << "Ended still-logged-in-check";
     
    8890util::Status Account::reloadOnlineParams() {
    8991    SNetworkReply reply;
    90     STATUS_RETURN_IF_ERROR(httpHelper()->syncGet(QString("TODO"), &reply));
     92    STATUS_RETURN_IF_ERROR(httpHelper()->syncGet(Gateway::URL_SEND_SMS, &reply));
    9193
    92     QString html = reply->readAll();
     94    QString html = QString::fromUtf8(reply->readAll());
    9395    return reloadOnlineParams(html);
    9496}
     
    99101}
    100102util::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 */
    102104
    103     QRegExp rx("TextSMS-Kontingent von \\d+ SMS verbraucht!");
     105    QRegExp rx(QString::fromUtf8("SMS Status: noch verfügbar - (\\d+) SMS"));
    104106    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);
    114110    }
     111
     112    setFreeSMSCount(rx.cap(1).toInt());
    115113    qDebug() << "  Free SMS count: " + rx.cap(1);
    116114
  • gateways/CoopMobile/business/account.h

    r454 r460  
    11/*
    22  Coop Mobile gateway plugin - The smssender plugin for the Coop Mobile platform.
    3   Copyright (C) 2011-2014, gorrión. See http://smssender.gorrion.ch
     3  Copyright (C) 2014-2015, gorrión. See http://smssender.gorrion.ch
    44
    55  This program is free software: you can redistribute it and/or modify
     
    4141
    4242public:
     43    QStringList divideMessageIntoShortSMS(const QString &message) const;
    4344    SNetworkHelper *httpHelper() const;
    4445
     
    5657    public:
    5758        QStringList divideMessageIntoLongSMS(const QString &message) const;
     59        QStringList divideMessageIntoShortSMS(const QString &message) const;
    5860        int costsForMessage(const QString &message) const;
    5961
  • gateways/CoopMobile/business/account_costs.cpp

    r458 r460  
    11/*
    22  Coop Mobile gateway plugin - The smssender plugin for the Coop Mobile platform.
    3   Copyright (C) 2011-2015, gorrión. See http://smssender.gorrion.ch
     3  Copyright (C) 2014-2015, gorrión. See http://smssender.gorrion.ch
    44
    55  This program is free software: you can redistribute it and/or modify
     
    2020#include "math.h"
    2121
     22#include "gateways/CoopMobile/business/gateway.h"
     23
    2224namespace CoopMobile {
    2325
     
    2628//   - http://coop.nth.ch/index/login/lang/de
    2729//   - http://coop.nth.ch/scripts/sms_counter_validator.js
    28 
    29 static const unsigned NUM_SHORT_SMS_PER_LONG_SMS = 5;
    3030
    3131struct MaxCount {
     
    5757    message.remove('\r');
    5858
     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
    5969    const bool messageContainsSpecialChars = hasSpecialChars(
    6070                message, QString("\r\n") + GSM_CHARS + GSM_DOUBLE_PRICE_CHARS);
     
    6676            : GSM_DOUBLE_PRICE_CHARS;
    6777    const unsigned maxLongSMSSize =
    68             maxCount->_long * NUM_SHORT_SMS_PER_LONG_SMS;
     78            maxCount->_long * Gateway::NUM_SHORT_SMS_PER_LONG_SMS;
    6979
    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);
    7386
    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;
    7688        if (lastLongSMSLength > maxCount->_short) {
    7789            *costs += ceil(lastLongSMSLength / (double)maxCount->_long);
     
    8193    }
    8294
     95    // Splits the text.
     96    QStringList longSMS = BaseMessageDivider::divideMessageIntoLongSMS(
     97                message, maxLongSMSSize - FORCED_MESSAGE_SUFFIX.length(),
     98                doublePriceChars, NULL);
    8399    return longSMS;
    84100}
     
    89105}
    90106
     107QStringList 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
    91128int Account::MessageDivider::costsForMessage(const QString &message) const {
    92129    int costs;
    93     divideMessageIntoLongSMS(message + FORCED_MESSAGE_SUFFIX, &costs);
     130    divideMessageIntoLongSMS(message, &costs);
    94131    return costs;
    95132}
  • gateways/CoopMobile/business/account_task_login.cpp

    r454 r460  
    11/*
    22  Coop Mobile gateway plugin - The smssender plugin for the Coop Mobile platform.
    3   Copyright (C) 2011-2014, gorrión. See http://smssender.gorrion.ch
     3  Copyright (C) 2014-2015, gorrión. See http://smssender.gorrion.ch
    44
    55  This program is free software: you can redistribute it and/or modify
     
    4545    if (rx.indexIn(html) != -1) {
    4646        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.")
    4949            ? util::StatusPermissionDenied("Invalid username/password.")
    5050            : util::StatusUnknown(error);
     
    5858}
    5959
    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 error
    77     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 request
    116     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 response
    163     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 
    17560Account *AccountLoginTask::account() const {
    17661    return static_cast<Account*>(BaseAccountLoginTask::account());
  • gateways/CoopMobile/business/account_task_sendsms.cpp

    r454 r460  
    11/*
    22  Coop Mobile gateway plugin - The smssender plugin for the Coop Mobile platform.
    3   Copyright (C) 2011-2014, gorrión. See http://smssender.gorrion.ch
     3  Copyright (C) 2014-2015, gorrión. See http://smssender.gorrion.ch
    44
    55  This program is free software: you can redistribute it and/or modify
     
    3939
    4040    qDebug() << "Start sending SMS";
    41     account()->reloadOnlineParams();
     41    account()->reloadOnlineParams().ignoreError(); // TODO: Should we really ignore it?
    4242    util::Status smsStatus = doDoSendSMS();
    43     account()->reloadOnlineParams();
     43    account()->reloadOnlineParams().ignoreError();
    4444    qDebug() << "SMS has been sent";
    4545    setProgress(100);
     
    6464            // Generate recipients string
    6565            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("");
    7566
    7667            // Send the message
    7768            setDetails(Action::SendingSMS);
    78             STATUS_RETURN_IF_ERROR(sendLongSMS(recipientsStr, msgPart));
     69            STATUS_RETURN_IF_ERROR(sendLongSMS(&i, msgPart));
    7970
    8071            setProgress(progress() + percent_per_sms);
     
    8576}
    8677
    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) {
     78util::Status SMSSendTask::sendLongSMS(
     79        QSetIterator<const SContact *> *recipientsIt, const QString &text) {
    9680    qDebug() << "Start of sending part of SMS";
    9781
     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
    9897    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    }
    104132
    105133    SNetworkReply reply;
    106134    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));
    109137    QString response = QString::fromUtf8(reply->readAll());
    110138
    111139    // 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);
    116143    if (response.indexOf(rx) > -1) {
    117         return util::StatusUnknown(rx.cap(1));
     144        return util::StatusUnknown(rx.cap(1)); // Only considers the first error
    118145    }
    119146
  • gateways/CoopMobile/business/account_tasks.h

    r454 r460  
    11/*
    22  Coop Mobile gateway plugin - The smssender plugin for the Coop Mobile platform.
    3   Copyright (C) 2011-2014, gorrión. See http://smssender.gorrion.ch
     3  Copyright (C) 2014-2015, gorrión. See http://smssender.gorrion.ch
    44
    55  This program is free software: you can redistribute it and/or modify
     
    3636private:
    3737    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;
    4538};
    4639
     
    5952private:
    6053    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,
    6355                             const QString &text) MUST_USE_RESULT;
    6456
  • gateways/CoopMobile/business/gateway.cpp

    r454 r460  
    11/*
    22  Coop Mobile gateway plugin - The smssender plugin for the Coop Mobile platform.
    3   Copyright (C) 2011-2014, gorrión. See http://smssender.gorrion.ch
     3  Copyright (C) 2014-2015, gorrión. See http://smssender.gorrion.ch
    44
    55  This program is free software: you can redistribute it and/or modify
     
    2222namespace CoopMobile {
    2323
    24 const QString Gateway::URL_LOGIN = "http://coop.nth.ch/index/login/lang/de";
     24const QString Gateway::URL_LOGIN = "https://coop.nth.ch/index/login/lang/de";
     25const QString Gateway::URL_SEND_SMS = "https://coop.nth.ch/smsbox/smsedit/lang/de";
    2526const short Gateway::MAX_RECIPIENTS_PER_SMS = 10;
     27const short Gateway::NUM_SHORT_SMS_PER_LONG_SMS = 5;
     28
    2629
    2730QString Gateway::name() const {
  • gateways/CoopMobile/business/gateway.h

    r454 r460  
    11/*
    22  Coop Mobile gateway plugin - The smssender plugin for the Coop Mobile platform.
    3   Copyright (C) 2011-2014, gorrión. See http://smssender.gorrion.ch
     3  Copyright (C) 2014-2015, gorrión. See http://smssender.gorrion.ch
    44
    55  This program is free software: you can redistribute it and/or modify
     
    3434public: /* IGateway */
    3535    static const QString URL_LOGIN;
     36    static const QString URL_SEND_SMS;
    3637    static const short MAX_RECIPIENTS_PER_SMS;
     38    static const short NUM_SHORT_SMS_PER_LONG_SMS;
    3739
    3840    QString name() const;
  • gateways/CoopMobile/gui/business/gateway_gui.cpp

    r454 r460  
    11/*
    22  Coop Mobile gateway plugin - The smssender plugin for the Coop Mobile platform.
    3   Copyright (C) 2011-2014, gorrión. See http://smssender.gorrion.ch
     3  Copyright (C) 2014-2015, gorrión. See http://smssender.gorrion.ch
    44
    55  This program is free software: you can redistribute it and/or modify
  • gateways/CoopMobile/gui/coopmobile.cpp

    r454 r460  
    11/*
    22  Coop Mobile gateway plugin - The smssender plugin for the Coop Mobile platform.
    3   Copyright (C) 2011-2014, gorrión. See http://smssender.gorrion.ch
     3  Copyright (C) 2014-2015, gorrión. See http://smssender.gorrion.ch
    44
    55  This program is free software: you can redistribute it and/or modify
  • gateways/CoopMobile/gui/coopmobile.h

    r454 r460  
    11/*
    22  Coop Mobile gateway plugin - The smssender plugin for the Coop Mobile platform.
    3   Copyright (C) 2011-2014, gorrión. See http://smssender.gorrion.ch
     3  Copyright (C) 2014-2015, gorrión. See http://smssender.gorrion.ch
    44
    55  This program is free software: you can redistribute it and/or modify
  • gateways/CoopMobile/gui/ui/settingswidget.cpp

    r454 r460  
    11/*
    22  Coop Mobile gateway plugin - The smssender plugin for the Coop Mobile platform.
    3   Copyright (C) 2011-2014, gorrión. See http://smssender.gorrion.ch
     3  Copyright (C) 2014-2015, gorrión. See http://smssender.gorrion.ch
    44
    55  This program is free software: you can redistribute it and/or modify
  • gateways/CoopMobile/gui/ui/settingswidget.h

    r454 r460  
    11/*
    22  Coop Mobile gateway plugin - The smssender plugin for the Coop Mobile platform.
    3   Copyright (C) 2011-2014, gorrión. See http://smssender.gorrion.ch
     3  Copyright (C) 2014-2015, gorrión. See http://smssender.gorrion.ch
    44
    55  This program is free software: you can redistribute it and/or modify
  • gateways/CoopMobile/lib/coopmobile.qrc

    r454 r460  
    11<RCC>
    22    <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>
    64    </qresource>
    75    <qresource prefix="/locale">
Note: See TracChangeset for help on using the changeset viewer.