Description:

This module is an integration module for First Data payment gateway. This module is different from the existing Commerce First Data module which is primary build for US market while this module is primary build for UK merchants. The Commerce First Data module provides the Global Gateway Service integration for First Data), while this module provides integration with First Data Connect payment gateway. Basically the module provides different service of First Data payment gateway than Commerce First Data module. There are many differences between those services provided by First Datas, which includes:
• The Commerce First Data module requires API access Key ID and HMAC KEY for processing the transactions while First Data Connect requires Store number, and Secret Phrase.
• There are differences in creating the hashing string first of all they use different hash functions, and different parameters are being hashed, the second feature is that First Data Connect provides additional hash option for First Data Connect which is called extended hash, this option will hash all of the parameters used in the request.
• Another difference is that First Data Connect payment gateway requires Time Zone to be applied to the api calls, the time zone should be the our server time zone. This is selected from Drupal Regional Settings.
• In First Data Connect there is an option to choose payment mode which is also a different feature, this payment mode will send only card holder basic information, some additional information or full shipping and billing information about the card holder to First Data Connect, depending which option you choose (PayOnly mode, PayPlus, or Full mode).
• Another difference is that the First Data Connect module provides language selection which means that merchants can choose in what language the information will be presented in front of the customers if the customer is redirected to First Data Pages like (hosted page, 3d secure page).
• This module also provides batch process for capturing transactions that were previously authorized. There is also a rule that is set to be triggered on cron run, this rule will capture all transactions that were authorized, the rule will start capturing transactions from 'now' (today), the rule can be modified to suit the merchants needs, you can just modify the time period for the capturing process just by replacing the time value (now) with '-1 day' which means that the rule will start capturing transactions from the day before 'today', if you replace that value with '-2 days' this means that the rule will start capturing transactions from 2 days ago, and so on and so on.

This module provides two types of payment methods: hosted (offsite payments) and direct. The hosted method is called: “First Data EMEA Connect - Hosted Payment Page” and the direct method is called: “First Data EMEA Connect - Merchant Payment Page”. For both of the payment methods Data Vault functionality is available, which can be applied if Commerce Card On File is installed. Be aware that First Data does not provide refund option from Drupal, this can be done only through the virtual terminal of First Data Connect. In Drupal merchants can capture and void transactions using this module. The module provides 3D secure authentication functionality as well for both of the payment methods. If Commerce Card On File is installed then customers can add/edit or delete their cards manually without the need to go through the checkout process.
Firstdata strongly recommend you install SSL Certificate (https) for your comfort, also if you do not have SSL certificate 3D secure may fail. Firstdata Connect requires all customers to be 3D secure authenticated! If merchants does not wish to use that service they should contact first data technical support:
https://www.firstdatams.co.uk/fdms/en_gb/home/contact-us.html

This module requires the following modules:
- Commerce
- Commerce_payment_ui
- Commerce_cart
- Commerce_checkout
- Commerce_oder_ui
- If you want to use data vault functionality you need to install card on file module as well.

Project Sandbox link:
https://www.drupal.org/sandbox/veso_83/2333675

You can clone the project to your local environment by using the following code:
git clone --branch 7.x-1.x http://git.drupal.org/sandbox/veso_83/2333675.git
commerce_firstdata_connect
cd commerce_firstdata_connect

or just visit the link below and follow the instructions:
https://www.drupal.org/project/2333675/git-instructions

Reviews of other projects
https://www.drupal.org/node/2325361#comment-9142993
https://www.drupal.org/node/2333151#comment-9143071
https://www.drupal.org/node/2327911#comment-9143113
https://www.drupal.org/node/2245645#comment-8706779
https://www.drupal.org/node/2145921#comment-9288271
https://www.drupal.org/node/2142003#comment-9288421
https://www.drupal.org/node/2267611#comment-9288371

Comments

PA robot’s picture

Status: Needs review » Needs work

There are some errors reported by automated review tools, did you already check them? See http://pareview.sh/pareview/httpgitdrupalorgsandboxveso_832333675git

We are currently quite busy with all the project applications and we prefer projects with a review bonus. Please help reviewing and put yourself on the high priority list, then we will take a look at your project right away :-)

Also, you should get your friends, colleagues or other community members involved to review this application. Let them go through the review checklist and post a comment that sets this issue to "needs work" (they found some problems with the project) or "reviewed & tested by the community" (they found no major flaws).

I'm a robot and this is an automated message from Project Applications Scraper.

veso_83’s picture

Issue summary: View changes
veso_83’s picture

Issue summary: View changes
veso_83’s picture

Issue summary: View changes
veso_83’s picture

Issue summary: View changes
veso_83’s picture

Issue summary: View changes
Status: Needs work » Needs review
Issue tags: +PAreview: review bonus
veso_83’s picture

Issue summary: View changes
mpdonadio’s picture

Status: Needs review » Postponed (maintainer needs more info)

Given that https://www.drupal.org/project/commerce_firstdata is seeking a new maintainer, and hasn't had a commit in a long time (I am assuming the 2013-09-30 was part of the general site wide repackaging), is there any chance that you can fold your functionality into that module or take that project over?

And just as a side note, this module is pretty huge. It is going to take us a while to read through about 2700 lines of code, so your patience with the process is appreciated.

veso_83’s picture

Hi mpdonadio,

Thanks for your replay, FirstData offers different services and this module in particular was built for their UK market mainly, and offers their ‘Connect’ service. This abandoned module is slightly different, offers different service, I think in future all of the First Data modules (including the one which is built mainly for the US market – the Global Gateway: https://www.drupal.org/project/commerce_firstdata_gge4) can be included into one big module providing all of the services of First Data.

Your help is appreciated,

Best regards,

Veso

veso_83’s picture

Status: Postponed (maintainer needs more info) » Needs review
benjaminarthurt’s picture

Status: Needs review » Needs work

Automated Review

No best practice issues identified by pareview.sh

No automated test cases were found, did you consider writing Simpletests or PHPUnit tests? This is not a requirement but encouraged for professional software development.

Manual Review

Individual user account
Yes: Follows the guidelines for individual user accounts.
No duplication
Unsure: Does not cause module duplication and fragmentation.
Reviewing @mpdonadio 's comments at #8, perhaps looking into adopting that module through the abanded module process, and merging the functionality of your sandbox project into it?
Master Branch
Yes: Follows the guidelines for master branch.
Licensing
Yes/No: Follows the licensing requirements
3rd party code
Yes: Follows the guidelines for 3rd party code.
README.txt/README.md
No: Follows the guidelines for in-project documentation and the README Template.
Does not follow the README template, consider modifying the contents to better fit the template, for consistency acrossed all projects.
Code long/complex enough for review
Yes: Follows the guidelines for project length and complexity.
Secure code
Unsure. If "no", list security issues identified.
My concern is with commerce_firstdata_connect.module, function commerce_firstdata_connect_cardonfile_update. It appears you are using $_GET and $_POST to set $params, and using these values else where. I do not see anywhere that directly displays these values, but have not been able to fully test the module fully due to it's integration complexity. Check into the possibility of using check_plain() or similiar if appropriate. Security is of utmost importance especially when dealing with credit card data.
I'm not going to tag this as a security issue, yet, as I've not been able to fully untagle how the data from the GET/POST is handled.
Coding style & Drupal API usage
  1. (*) Major finding
  2. Minor finding
  3. (+) Release blocker
  4. (*) Major finding

The starred items (*) are fairly big issues and warrant going back to Needs Work. Items marked with a plus sign (+) are important and should be addressed before a stable project release. The rest of the comments in the code walkthrough are recommendations.

If added, please don't remove the security tag, we keep that for statistics and to show examples of security problems.

This review uses the Project Application Review Template.

veso_83’s picture

Hi benjaminarthurt,
Thanks for your replay, I went through the points you are stating and here are my comments.
- About @mpdonadio 's comments at #8, the abandoned commerce_firstdata module offers a different service of FirstData payment gateway. This module is integration module for FirstData Connect payment gateway, which is a payment gateway primarily created for the UK market, in general FirstData provides different services and payment gateways like FirstData Connect or FirstData Global Gateway.
- Readme.txt: The readme file was changed to fit the drupal coding standards.
- Secure code: I’ve changed the code to use check_plain for the post.

Thanks again for your replay,

Best regards,

Veso

veso_83’s picture

Status: Needs work » Needs review
mpdonadio’s picture

Assigned: Unassigned » mpdonadio

Setting as my next review.

mpdonadio’s picture

BTW, this is a big, dense module. I may not have a review done until tomorrow. I'm sorry for the delay, but your patience is appreciated.

mpdonadio’s picture

deleted double submit

veso_83’s picture

Thanks for your time mpdonadio, looking into my module.
Best regards,

Veso

mpdonadio’s picture

Assigned: mpdonadio » Unassigned
Status: Needs review » Needs work
Issue tags: +PAreview: security

Automated Review

Git default branch is not set, see the documentation on setting a default branch.
Review of the 7.x-1.x branch (commit 35c5c8f):

  • No automated test cases were found, did you consider writing Simpletests or PHPUnit tests? This is not a requirement but encouraged for professional software development.

This automated report was generated with PAReview.sh, your friendly project application review script. You can also use the online version to check your project. You have to get a review bonus to get a review from me.

This was another module that exposed a bug in PHPCS and/or CodeSniffer, so results may not be accurate.

Manual Review

Individual user account
Yes/No: Follows the guidelines for individual user accounts.
No duplication
Yes: Does not cause module duplication and fragmentation.
Master Branch
Yes: Follows the guidelines for master branch, but you need to set the default for the project.
Licensing
Yes: Follows the licensing requirements
3rd party code
Yes: Follows the guidelines for 3rd party code.
README.txt/README.md
Yes: Follows the guidelines for in-project documentation and the README Template.
Code long/complex enough for review
Yes: Follows the guidelines for project length and complexity.
Secure code
No. If "no", list security issues identified.

(*) commerce_firstdata_connect_createHash, use drupal_hmac_base64() instead of sha1().

(*) In the API callbacks (eg, commerce_firstdata_connect_3d_secure_callback), how do you know you have a legit callback and not a spoof? Is there a token that gets checked? I am not seeing this.

Coding style & Drupal API usage
WHy your own required markup / styles for required fields? Drupal already provides this. Also, using !important will make it much harder for someone to change how this looks.

In commerce_firstdata_connect_capture_form(), you have some double translated strings (line 35). This will also lead to double escaping. You can just use $description there; the t() w/ @ placeholders made it safe.

commerce_firstdata_connect_capture_form() has some bad indentation around the confirm_form() bit.

drupal_goto() shouldn't be called from a form submit handler; $form_state['redirect'] is preferred.

In commerce_firstdata_connect_capture_form_submit(), $response_data_codes may used initialized on line 123.

(+) It looks like commerce_firstdata_connect_cancel_form_submit() has an untranslated string near the end.

commerce_firstdata_connect.api.inc is a class and should be listed in the files[] in the .info

The normal convention with Commerce stuff is to use entity_metadata_wrappers instead of directly poking into the entities themselves.

(+) The methods on CommerceFirstdataConnectConnectApi() need proper docblocks with parameters, return, etc.

CommerceFirstdataConnectConnectApi::directPayments() should use URL to build up the urls instead of $base_root.

CommerceFirstdataConnectConnectApi:buildUrl(), look into drupal_http_build_query()

CommerceFirstdataConnectConnectApi::commerceFirstdataConnectDevice(), UA detection and reliance is very fragile. Avoid it when possible.

CommerceFirstdataConnectConnectApi::crossPayment(), what is the sleep() for. Comment needed.

Why the cache_clear_all in commerce_firstdata_connect_commerce_cardonfile_checkout_pane_form_alter(). Comment needed.

(+) commerce_firstdata_connect_commerce_cardonfile_checkout_pane_form_alter() has a handful of untranslated strings. Double check the module.

In commerce_firstdata_connect_submit_form_validate(), why two checks for $validate? Comment needed.

In commerce_firstdata_connect_submit_form_submit(), $api appears to be unused.

commerce_firstdata_connect_commerce_payment_method_info(). Why the comment about Ogone?

In commerce_firstdata_connect_cardonfile_update(), which the check_plains? These don't appear to be going to output? See https://www.drupal.org/node/263002 and https://www.drupal.org/node/263002

In commerce_firstdata_connect_hosted_fail_callback(), you don't need to use $base_root with url(). Also elsewhere.

In commerce_firstdata_connect_hosted_callback, you have a drupal_goto(t()). I suspect you wanted something else here. drupal_goto() will internally use url(), which makes the URL safe. Also elsewhere.

This module could use a fair more comments and/or vertical whitespace to separate out logical blocks.

(+) Does commerce_cardonfile need to be a dependency? It looks like in some places you feature check, but not always.

commerce_firstdata_connect_settings_form() has a variable_get() w/o a default value. Also elsewhere.

(*) I am not positive if your handling of $time_zone_string in commerce_firstdata_connect_settings_form() is truly save. check_plain() or use t() with placeholders.

[module line 1226]

The starred items (*) are fairly big issues and warrant going back to Needs Work. Items marked with a plus sign (+) are important and should be addressed before a stable project release. The rest of the comments in the code walkthrough are recommendations.

The security issue is an easy fix, but this module needs a second sets of eyee regardless to look at it. It is over 2500 lines of dense code.

If added, please don't remove the security tag, we keep that for statistics and to show examples of security problems.

This review uses the Project Application Review Template.

veso_83’s picture

Status: Needs work » Needs review
StatusFileSize
new195.56 KB

Hi mpdonadio,
Thanks for your response; I hope I will answer correctly to all of your questions and concerns.
Secure code:
- I cannot use drupal_hmac_base64() because this function uses different algorithm type(SAH256), which is great but the connect platform of firstdata expects different result and uses different function for hashing -> sha1(see page 13 of the manual attached to this email).
- A new function (calculateResponseHash in the api file) was added to calculate and compare the response hash string.
Coding style & Drupal API usage
- The required fields were modified in such a way so that I won’t need #required option, because I want to pass the values of those fields even if they are empty, but to restrict the same field for the hosted payment method and only for cardonfile which was conflicting with drupal, so the only way to do that was to accept even empty values and then check for particular cases whether or not the customer can proceed.
- The double translation is fixed.
- The indentation around the confirm_form() bit is done for better visualization of the code, most of the commerce_payment gateway modules are following that practice including commerce_paypal, commerce_amex, commerce_authnet I’m just following best recommended practices.
- Using the form_state[‘redirect’] instead of drupal_goto() in submit handler – this is fixed.
- The variable for the response codes was initialized previously.
- The untranslated string in commerce_firstdata_connect_cancel_form_submit(), is translated now.
- about the class that needs to be included in files[] in .info file, I would say, it’s better as I built it by using commerce_firstdata_connect_api_object() function which is creating an object of a particular payment method(this module have two different payment methods with lightly different settings), and if the class is included in files[] in .info file it will be included on every page, which is something that we must avoid.
- About using entity_metadata_wrappers most of the payment gateways modules like (commerce_cardsave, commerce_amex, commerce_ authnet) do not use entity_metadata_wrappers I believe it is more suitable.
- The docblocks blocks were modified and information parameters and return was added.
- The $base_root is just used for the main part of the url which is the same for all of the urls, I saw lot of modules are implementing this process and I think it is very suitable.
- About using drupal_http_build_query() I did make this buildUrl() custom function to fit my case it is more suitable way because it allows me to customize the way the url is built.
- The device detection was built because in some cases it is required.
- The sleep() function was added in the crossPayment() function because the way I coded the module I’ve used timestamp for creating and differentiating the orders ids(not always you are able to achieve uniqueness for the orders), so process of creating manually a card on file is by creating ‘fake order’ process the order capture the transaction and void it! The problem is in the timestamp all of the 3 transaction operations most of the time were done within 1s which means all 3 transactions will have same timestamps in this cases this process will fail! I used sleep, so that different timestamp will be applied. It is a very complex method I know but FirstData do not have a function that may be used for adding or updating card on file they requested that way to be done!
- I’ve added cache_clear_all because on the checkout page form the ajax did not worked properly with chache_clear_all it worked. But I assume it was my local issue, I’ve tested it again and it was working properly I’ve removed the cache_clear_all().
- In commerce_firstdata_connect_commerce_cardonfile_checkout_pane_form_alter() the only un-translated strings are values of variables which must not be translated.
- The second validation in commerce_firstdata_connect_submit_form_validate() was removed.
- The $api variable is actually being used(check the bottom of the page) in
commerce_firstdata_connect_submit_form_submit().
- My mistake with the names of the modules, I was just working on both modules at the same time, I fixed the name of the gateway in the docblock for commerce_firstdata_connect_commerce_payment_method_info()
- ¬In this case the check_plain(), is used to sanitize the incoming data, as per benjaminarthurt request see his post above.
- $base_root was removed from url() in the commerce_firstdata_connect_hosted_fail_callback().
- commerce_firstdata_connect_hosted_callback() I’m using placeholders so the url is save.
- The module does not depend on cof module but checks were done where necessary.
- t() is now used in commerce_firstdata_connect_settings_form for safety.

I hope this satisfy your questions. If you need any more information please do not hesitate to contact me.

Best regards,

Veso

pushpinderchauhan’s picture

Assigned: Unassigned » pushpinderchauhan

Assigning to myself for next review.

pushpinderchauhan’s picture

Assigned: pushpinderchauhan » Unassigned
Status: Needs review » Needs work
Issue tags: -PAreview: review bonus

Automated Review

Git default branch is not set, see the documentation on setting a default branch.

Review of the 7.x-1.x branch (commit 7824295):

  • (*) PHP Fatal error: Default value for parameters with array type hint can only be an array or NULL in ./includes/commerce_firstdata_connect.api.inc on line 239

    Errors parsing ./includes/commerce_firstdata_connect.api.inc
  • No automated test cases were found, did you consider writing Simpletests or PHPUnit tests? This is not a requirement but encouraged for professional software development.

This automated report was generated with PAReview.sh, your friendly project application review script. You can also use the online version to check your project. You have to get a review bonus to get a review from me.

Manual Review

  1. (*) commerce_firstdata_connect_batch_operation(): $_SESSION['http_request_count']++; Usage of session doesn't make any sense here, IMO that's not the right way to do this at all. Use the batch sandbox to store details from one batch iteration to the next, it's what it's there to do.
    foreach ($all_transactions as $key => $value) {
        $transaction_id = $value->transaction_id;
    
        $operations[] = array(
          'commerce_firstdata_connect_batch_operation',
          array(
            $transaction_id,
            t('(Operation @operation)', array('@operation' => $key)),
          ),
        );
      }
    

    commerce_firstdata_connect_batch_process(): That's not the best way to use BatchAPI. You should only add the operation once, and let the operation iterate over a set number of results, using the sandbox to mark how far it got each time.

  2. (+) commerce_firstdata_connect_get_response_data(): Lack of comments and unfriendly variable names make it hard to understand this code. Same thing applies at other places too in your code as huge code is there :)
    $new_array = array_combine($names_array, $values_array);

    $names_array and $values_array both are not declared within this function, in any case if $exp comes empty then unnecessary notices will be produced.

  3. commerce_firstdata_connect_settings_form(): '#default_value' => !empty($settings['url']) ? $settings['url'] : 'test', Looks like default value is 'test', not meaningful at all.

    commerce_firstdata_connect_redirect_form(): if ($payment_methods['settings']['url'] == 'test') {, again 'test' coming within if condition, comment needed?

  4. commerce_firstdata_connect_submit_form_submit():
    foreach ($new_form as $k => $v) {
          if ($k != (count($new_form) - 1)) {

    count() inside loop for same array is not a good practice, I would recommend you to store count once and use the same variable further. Check the same for other places too.

  5. hook_help() is missing.
  6. Project Page: It contains enough information but looks like not well organised, better to go through Tips for a great project page again.
  7. (+) commerce_firstdata_connect_settings_form() :
    '#description' => t('Please enter your store id. For more information, visit <a href= "https://www.firstdatams.co.uk/fdms/en_gb/home.html"> firstdata web site </a>'),
    

    In form elements, you are directly keeping hyperlink within markup string instead insert hyperlink markup into the translatable string with placeholder. See https://www.drupal.org/node/322774.

  8. You have hardcoded amount value to 10 at 13 places in your code either make it configurable from admin or define as a constant. Also your comment needed why it is 10?
  9. commerce_firstdata_connect_get_response_code() : Lot of if statement coming within this function, addition of inline comment would be good.

The starred items (*) are fairly big issues and warrant going back to Needs Work. Items marked with a plus sign (+) are important and should be addressed before a stable project release. The rest of the comments in the code walkthrough are recommendations.

Removing review bonus tag, you can add it again if you have done another 3 reviews of other projects.

Thanks!

veso_83’s picture

Status: Needs work » Needs review

Hi er.pushpinderrana,
Thank you for your time reviewing my project. Here are my comments and answers to your questions.
- A default branch was set.
- About the automated test, I did small changes, so now should be all right.
- The session variable I’ve used before for my tests but yes it’s not needed any more, so I’ve removed it.
- This is not typical batch process but instead it is built to work with rules, in general the batch process has problems working directly with rules so I needed, some twisting around to be applied in commerce_firstdata_connect_batch_process() as well as the rest of the code, I’ve tested it and it works fine.
- About the commerce_firstdata_connect_get_response_data(), I’ve added some extra comments to make it clear what this function does. Simply it creates an array of the incoming html data. The way first data connect responds is in html format and not very nice html, so this function is basically extracting the incoming data. The array_combine() combines the values from the input tags, with the names, the functions is looking for specific tags with name and values if the respond is empty or wrong somehow it will return an empty array, which is handled in the checks before saving the transaction.
- About the ‘test’ value for the url that will be used for the requests, I’m setting always the ‘test’ value for payment gateways because most of the gateways are advising to do so, which is correct, merchants should always test first of all the gateway then move to production. In the implementation instruction it is always advised to do so, and of course switch to the production link as soon as the merchants are ready to do so.
- commerce_firstdata_connect_submit_form_submit(): about the count the $new_form is fixed value, won’t change won’t produce issues it works fine this way, storing small bit of data like that it is not recommended, first because parameters number may change which will need manual change, second of all storing all the time meaningless data like counters will make the site more heavier and slower, we should reduce such things as much as we can.
- hook_help(): This function is not implemented because, first of all I don’t think it is needed. The only page where are needed help instruction is the admin UI of the two rules, but there the payment UI provides that function with nice instructions, about the specific fields for the two payment methods of first data, there are nice instructions below each field, merchants that what’s to implement that module should use the manual provided by first data and follow their registration instructions anyway. The purpose here is to keep the module as clean and clear as possible, adding more comments might make it more complex. In fact none of the payment gateways I’m familiar with (like: commerce_paypal, commerce_amex, commerce_paypal, commerce_cardsave, commerce_authnet and so on and so on) are implementing hook_help().
- The project page is written according to the drupal standards I believe I’ve followed them strictly, it contains all the features of a drupal project page, the module is big and has two payment methods which are having some specific unique features, that is the reason why the description is a bit longer, but otherwise I believe it is a nice project page.
- commerce_firstdata_connect_settings_form() : The static links were wrapped in t() function.
- About the amount equal to 10, it is good to be hardcoded, also that was a request by firstdata connect, because they do not have a method (function) that can be used to manually create card on file, the only way to do that is to create a normal (fake) transaction, with of course small amount of money this is the amount value equal to 10, it is not the decimal value, which means it’s 0.1 units. Then this transaction is processed normally, the card is saved, and the transaction is voided, so that the customer won’t be charged! As I said this is the only way to add manually card on file for this payment gateway, and this functionality was requested by FirstData Connect.
- The payment method is a bit unusual, it sends the data not in a ‘appropriate’ formats like xml, json it sends it in html and some strings separated with a specific delimiter that’s why I’ve created those functions: commerce_firstdata_connect_get_response_data() and commerce_firstdata_connect_get_response_code() to extract the necessary data. I’ve added some additional inline comments.

Hope that satisfies your concerns and questions,

Best regards,

Veso

veso_83’s picture

Issue summary: View changes
Issue tags: +PAreview: review bonus
pushpinderchauhan’s picture

Status: Needs review » Reviewed & tested by the community

Automated Review

Review of the 7.x-1.x branch (commit f8c6b88):

  • No automated test cases were found, did you consider writing Simpletests or PHPUnit tests? This is not a requirement but encouraged for professional software development.

This automated report was generated with PAReview.sh, your friendly project application review script. You can also use the online version to check your project. You have to get a review bonus to get a review from me.

Manual Review

commerce_firstdata_connect_batch_rule(): $_SESSION['http_request_count'] = 0; not in use, so remove it.

My all #21 concerns have been addressed or answered, I'm not seeing any blocking issue further, setting RTBC to this.

pushpinderchauhan’s picture

Status: Reviewed & tested by the community » Fixed

Thanks for your contribution, veso_83!

I updated your account so you can promote this to a full project and also create new projects as either a sandbox or a "full" project.

Here are some recommended readings to help with excellent maintainership:

You can find lots more contributors chatting on IRC in #drupal-contribute. So, come hang out and stay involved!

Thanks, also, for your patience with the review process. Anyone is welcome to participate in the review process. Please consider reviewing other projects that are pending review. I encourage you to learn more about that process and join the group of reviewers.

Thanks to the dedicated reviewer(s) as well.

Status: Fixed » Closed (fixed)

Automatically closed - issue fixed for 2 weeks with no activity.