This discussion is archived
1 2 Previous Next 17 Replies Latest reply: May 6, 2013 4:31 AM by SatyaVenkat RSS

How to handle forgotpasswords

SatyaVenkat Newbie
Currently Being Moderated
Hi all,


How to handle forgot passwords in the ATG applications.

Regards,
Satya.
  • 1. Re: How to handle forgotpasswords
    Nitin Khare Expert
    Currently Being Moderated
    You can use OOB component /atg/userprofiling/ForgotPasswordHandler to handle forgot password. Go through its documentation here:

    http://docs.oracle.com/cd/E35318_02/Platform.10-1-1/ATGPersProgGuide/html/s0507handlingforgottenpasswords01.html

    If you have CRS setup then you can see forgot password handling in action using ForgotPasswordHandler. Hope this helps to get you started.
  • 2. Re: How to handle forgotpasswords
    SatyaVenkat Newbie
    Currently Being Moderated
    Hi ,

    I did all the configurations as follows.


    /config/atg/userprofiling/ForgotPasswordEmailInfo.properties
    ----------------------------------------
    $class=atg.userprofiling.email.TemplateEmailInfoImpl
    templateURL=forgot_password_email.jsp
    contentProcessor=/atg/userprofiling/email/HtmlContentProcessor
    # Get message subject and addressing information from the template
    fillFromTemplate=true
    # email subject and sender address.
    messageSubject=Requested Password
    messageFrom=<username>@gmail.com
    loggingDebug=true


    /config/atg/userprofiling/ForgotPasswordHandler.properties
    ---------------------------------------------------------------------------------
    $class=atg.userprofiling.ForgotPasswordHandler

    templateEmailSender=/atg/userprofiling/email/TemplateEmailSender
    profileTools=/atg/userprofiling/ProfileTools
    templateEmailInfo=/atg/userprofiling/ForgotPasswordEmailInfo
    loggingdebug=true


    /config/atg/dynamo/service/SMTPEmail.properties
    ---------------------------------------------------------
    # /atg/dynamo/service/SMTPEmail
    #Wed Feb 01 14:45:23 CST 2012
    defaultFrom=<username>@gmail.com
    loggingDebug=true
    emailHandlerHostName=smtpcorp.com
    emailHandlerPort=2525
    username=<usename>
    password=<password>


    forgotPassword.jsp
    --------------------------------------
    In this form i entered value for login filed (i.e,email) and trying to submit,but it's giving the form exception like , *"No Profile found"*.

    But actually that email was registered.

    Regards,
    Satya.
  • 3. Re: How to handle forgotpasswords
    RMishra Journeyer
    Currently Being Moderated
    Also make sure you have:
    TemplateEmailSender:
    $class=atg.userprofiling.email.TemplateEmailSender
    siteHttpServerName=......
    siteHttpServerPort=........
    contextPathPrefix=/MyModulecontectname

    In /config/atg/userprofiling/ForgotPasswordHandler.properties add:
    newPasswordParam=newpassword
    In this form i entered value for login filed (i.e,email) and trying to submit,but it's giving the form exception like , "No Profile found".
    I am not getting clearly that you want to say.
    What you need to do is that you will click a link "forget password" that will redirect to another page like forgerpassword.jsp like below:
    {code
    forgerpassword.jsp:
    <dsp:form action="forgetpassword.jsp" method="post">
    ..............
    <dsp:droplet name="ErrorMessageForEach">
         <dsp:oparam name="output">
              <b><dsp:valueof param="message" /></b>
         </dsp:oparam>
    </dsp:droplet>
    Enter Email<dsp:input type="text" bean="ForgotPasswordHandler.value.email" required="true" name="aaaaa"/>
    <dsp:input bean="ForgotPasswordHandler.forgotPassword" type="submit" value="submit"/>
    <dsp:input bean="ForgotPasswordHandler.forgotPasswordSuccessURL" type="hidden" value="emailSent.jsp"/>
    <dsp:input bean="ForgotPasswordHandler.forgotPasswordErrorURL" type="hidden" value="forgetpassword.jsp" />
    </dsp:form>
    -RMishra                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    
  • 4. Re: How to handle forgotpasswords
    SatyaVenkat Newbie
    Currently Being Moderated
    Hi RMishra,

    I added the same ,but still it's giving " NO PROFILE FOUND" form exception.

    TemplateEmailSender:
    $class=atg.userprofiling.email.TemplateEmailSender
    siteHttpServerName=......
    siteHttpServerPort=........
    contextPathPrefix=/MyModulecontectname

    In /config/atg/userprofiling/ForgotPasswordHandler.properties add:
    newPasswordParam=newpassword


    Please tell me any other config is required.

    Regards,
    Satya.
  • 5. Re: How to handle forgotpasswords
    RMishra Journeyer
    Currently Being Moderated
    To make sure if profile is available or not, open dyn/admin-->Component Browser-->/atg/userprofiling/Profile, if it is showing found then open dyn/admin-->Component Browser-->/atg/userprofiling/ProfileTools--> check profilePath property=/atg/userprofiling/Profile?
    Also can you share logs here?

    -RMishra
  • 6. Re: How to handle forgotpasswords
    SatyaVenkat Newbie
    Currently Being Moderated
    Hi RMishra ,

    I am not able to see Profile in this path-->dyn/admin-->Component Browser-->/atg/userprofiling/,and i am able to see PrifileTools.
    In ProfileTools the value for profilePath is pointing to "/atg/userprofiling/Profille" only.


    And regarding ForgotPasswordFormHandler,no logs are displaying on the console.

    One thing is I am new to ATG framework,and i am a fresh postgraduate.I am in learning stage.

    can you please help me in the same.

    Regards,
    Satya.
  • 7. Re: How to handle forgotpasswords
    SatyaVenkat Newbie
    Currently Being Moderated
    still not able to resolve the errors.
  • 8. Re: How to handle forgotpasswords
    RMishra Journeyer
    Currently Being Moderated
    I am not able to see Profile in this path-->dyn/admin-->Component Browser-->/atg/userprofiling/
    Profile is session-scoped component so you need to write whole component path. From Component Browser-->/atg/userprofiling/Profile
    And regarding ForgotPasswordFormHandler,no logs are displaying on the console.
    add components like /atg/userprofiling/ProfileTools.properties, \atg\userprofiling\ForgotPasswordHandler.properties in your modules if you already do not have and add
    loggingDebug=true then you will be able to see log in console.

    -RMishra
  • 9. Re: How to handle forgotpasswords
    SatyaVenkat Newbie
    Currently Being Moderated
    Hi Mishra,

    Now profile is identifying.
    now my question is,i am not getting the response mail.

    Here is the LOG i am getting.
    --------------------------------------------

    16:14:00,463 INFO [STDOUT] DEBUG: setDebug: JavaMail version 1.4ea
    16:14:00,469 INFO [STDOUT] DEBUG: getProvider() returning javax.mail.Provider[TRANSPORT,smtp,com.sun.mail.smtp.SMTPTransport,Sun Microsystems, Inc]
    16:14:00,516 INFO [SMTPEmail] DEBUG Attempting to open a connection...
    16:14:00,516 INFO [STDOUT] DEBUG SMTP: useEhlo true, useAuth false
    16:14:00,518 INFO [STDOUT] DEBUG SMTP: trying to connect to host "smtpcorp.com", port 8025, isSSL false
    16:14:03,729 INFO [STDOUT] 220 smtpcorp.com ESMTP Exim 4.72 Wed, 24 Apr 2013 10:44:01 +0000
    16:14:03,730 INFO [STDOUT] DEBUG SMTP: connected to host "smtpcorp.com", port: 8025
    16:14:03,744 INFO [STDOUT] EHLO SandeepKandari
    16:14:04,014 INFO [STDOUT] 250-smtpcorp.com Hello SandeepKandari [202.65.129.244]
    250-SIZE 52428800
    250-PIPELINING
    250-AUTH CRAM-MD5 PLAIN LOGIN
    250-STARTTLS
    250 HELP
    16:14:04,015 INFO [STDOUT] DEBUG SMTP: Found extension "SIZE", arg "52428800"
    16:14:04,015 INFO [STDOUT] DEBUG SMTP: Found extension "PIPELINING", arg ""
    16:14:04,015 INFO [STDOUT] DEBUG SMTP: Found extension "AUTH", arg "CRAM-MD5 PLAIN LOGIN"
    16:14:04,016 INFO [STDOUT] DEBUG SMTP: Found extension "STARTTLS", arg ""
    16:14:04,016 INFO [STDOUT] DEBUG SMTP: Found extension "HELP", arg ""
    16:14:04,016 INFO [STDOUT] NOOP
    16:14:04,286 INFO [STDOUT] 250 OK
    16:14:04,288 INFO [STDOUT] NOOP
    16:14:04,560 INFO [STDOUT] 250 OK
    16:14:04,562 INFO [STDOUT] NOOP
    16:14:04,831 INFO [STDOUT] 250 OK
    16:14:04,831 INFO [STDOUT] QUIT
    16:14:05,100 INFO [STDOUT] 221 smtpcorp.com closing connection
    ---------------------------------------------------------------------------------------------------------

    Please let me know what's the problem.

    Regards,
    Satya.
  • 10. Re: How to handle forgotpasswords
    RMishra Journeyer
    Currently Being Moderated
    Can you share TemplateEmailSender.properties configuration?
    16:14:03,744 INFO [STDOUT] EHLO SandeepKandari
    16:14:04,014 INFO [STDOUT] 250-smtpcorp.com Hello SandeepKandari [202.65.129.244]>
    Also have a look from where SandeepKandari and Hello SandeepKandari message are comming.

    -RMishra
  • 11. Re: How to handle forgotpasswords
    SatyaVenkat Newbie
    Currently Being Moderated
    Hi ,

    Here is the property file.

    TemplateEmailSender.properties
    ----------------------------------------------
    $class=atg.userprofiling.email.TemplateEmailSender
    $scope=global

    siteHttpServerName=localhost
    siteHttpServerPort=8080

    contextPathPrefix=/ClothingStore

    loggingdebug=true
    loggingInfo=true
    -----------------------------------

    SandeepKandari is a name of the Computer.


    Regards,
    Satya.
  • 12. Re: How to handle forgotpasswords
    RMishra Journeyer
    Currently Being Moderated
    >
    TemplateEmailSender:
    $class=atg.userprofiling.email.TemplateEmailSender
    $scope=global

    siteHttpServerName=localhost
    siteHttpServerPort=8080

    contextPathPrefix=/ClothingStore

    loggingdebug=true
    loggingInfo=true>
    change loggingdebug as loggingDebug
    loggingDebug=true
    Alternatively after starting server make check if loggingDebug property is true or not in dyn/admin-->Component Browser-->/atg/userprofiling/email/TemplateEmailSender and other related component. you can change it from here also and It'll work still server is running

    >
    /config/atg/userprofiling/ForgotPasswordEmailInfo.properties
    $class=atg.userprofiling.email.TemplateEmailInfoImpl
    templateURL=forgot_password_email.jsp
    contentProcessor=/atg/userprofiling/email/HtmlContentProcessor
    # Get message subject and addressing information from the template
    fillFromTemplate=true
    # email subject and sender address.
    messageSubject=Requested Password
    messageFrom=<username>@gmail.com
    loggingDebug=true
    >
    templateURL=forgot_password_email.jsp [here put whole path after YourModule.war directory]
    change messageFrom=<username>@gmail.com to messageFrom^=<username>@gmail.com

    >
    /config/atg/userprofiling/ForgotPasswordHandler.properties
    $class=atg.userprofiling.ForgotPasswordHandler

    templateEmailSender=/atg/userprofiling/email/TemplateEmailSender
    profileTools=/atg/userprofiling/ProfileTools
    templateEmailInfo=/atg/userprofiling/ForgotPasswordEmailInfo
    loggingdebug=true
    >
    add $scope=request
    change loggingdebug=true to loggingDebug=true
    add newPasswordParam=newpassword
    /config/atg/dynamo/service/SMTPEmail.properties
    # /atg/dynamo/service/SMTPEmail
    #Wed Feb 01 14:45:23 CST 2012
    defaultFrom=<username>@gmail.com
    loggingDebug=true
    emailHandlerHostName=smtpcorp.com
    emailHandlerPort=2525
    username=<usename>
    password=<password>
    >
    I am using emailHandlerPort=25 in place of emailHandlerPort=2525
    can you change emailHandlerPort=2525 to emailHandlerPort=25 to check it

    Please check make changes and let us know console output.

    -RMishra

    Edited by: RMishra on Apr 26, 2013 1:38 PM

    Edited by: RMishra on Apr 26, 2013 1:42 PM
  • 13. Re: How to handle forgotpasswords
    SatyaVenkat Newbie
    Currently Being Moderated
    Hi ,


    I did all the configurations as follows.


    /atg/userprofiling/email/TemplateEmailSender.properties
    -----------------------
    $class=atg.userprofiling.email.TemplateEmailSender
    $scope=global

    siteHttpServerName=localhost
    siteHttpServerPort=8080

    contextPathPrefix=/ClothingStore

    loggingDebug=true
    loggingInfo=true
    ------------------------------


    /atg/userprofiling/ForgotPasswordEmailInfo.properties
    ---------------------------------
    $class=atg.userprofiling.email.TemplateEmailInfoImpl
    $scope=request

    templateURL=/emailtemplates/forget_password_email.jsp
    contentProcessor=/atg/userprofiling/email/HtmlContentProcessor

    # Get message subject and addressing information from the template
    fillFromTemplate=true

    # email subject and sender address.

    messageSubject=Requested Password
    messageFrom^=/atg/dynamo/service/SMTPEmail.defaultFrom

    loggingDebug=true
    loggingInfo=true
    --------------------------


    /atg/userprofiling/ForgotPasswordHandler.properties
    ----------------------------------------
    $class=atg.userprofiling.ForgotPasswordHandler
    $scope=request

    templateEmailSender=/atg/userprofiling/email/TemplateEmailSender
    profileTools=/atg/userprofiling/ProfileTools
    templateEmailInfo=/atg/userprofiling/ForgotPasswordEmailInfo

    newPasswordParam=newpassword
    loggingDebug=true
    loggingInfo=true
    ------------------------------------

    /atg/dynamo/service/SMTPEmail.properties
    ------------------------
    # /atg/dynamo/service/SMTPEmail
    #Wed Feb 01 14:45:23 CST 2012

    emailHandlerHostName=smtpcorp.com
    emailHandlerPort=2525

    defaultFrom=*****@gmail.com
    username=*****
    password=******

    loggingDebug=true
    loggingInfo=true



    /store.war/emailtemplates/forget_password_email.jsp
    ----------------------------

    <tr>
                             <td>Username:</td>
                             <td><dsp:valueof bean="Profile.email" />
                             </td>
                        </tr>
                        <tr>
                             <td>Password:</td>
                             <td><dsp:valueof param="newpassword" /></td>
                        </tr>
    --------------------------------



    /store.war/forgotPassword.jsp
    ---------------------------
    <%@ page language="java" contentType="text/html; charset=UTF-8"
         pageEncoding="UTF-8"%>
    <%@ taglib uri="http://www.atg.com/taglibs/daf/dspjspTaglib1_0"
         prefix="dsp"%>

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <link href="styles/layout.css" rel="stylesheet" type="text/css"
         media="all" />
    <link href="styles/base.css" rel="stylesheet" type="text/css"
         media="all" />
    <link href="styles/content.css" rel="stylesheet" type="text/css"
         media="all" />
    <link href="styles/jquery_ui.css" rel="stylesheet" type="text/css"
         media="all" />
    <title>demo</title>
    </head>
    <dsp:page>
         <body>

              <div id="wrap" class="clear-block">
                   <div id="header"><jsp:include page="header.jsp" /></div>
                   <h3>log in</h3>

                   <div class="login">
                        <div class="text">Please enter your registered login email</div>
                        <dsp:importbean bean="/atg/userprofiling/ProfileFormHandler" />
                        <dsp:importbean bean="/atg/userprofiling/ProfileErrorMessageForEach" />
                        <dsp:importbean bean="/atg/dynamo/droplet/ErrorMessageForEach" />
                        <dsp:importbean bean="/atg/dynamo/droplet/Switch" />
                        <dsp:importbean bean="/atg/dynamo/droplet/ForEach" />
                        <dsp:importbean bean="/atg/userprofiling/ForgotPasswordHandler" />
                        <dsp:form action="forgotPassword.jsp" method="post">

                             <dsp:input bean="ForgotPasswordHandler.forgotPasswordErrorURL"
                                  type="hidden" value="forgotPassword.jsp" />
                             <dsp:input bean="ForgotPasswordHandler.forgotPasswordSuccessURL"
                                  type="hidden" value="login.jsp" />

                             <dsp:setvalue bean="ProfileFormHandler.clear" value="" />
                             <dsp:droplet name="Switch">
                                  <dsp:param bean="ForgotPasswordHandler.formError" name="value" />
                                  <dsp:oparam name="true">
                                       <ul>
                                            <dsp:droplet name="ErrorMessageForEach">
                                                 <dsp:param bean="ForgotPasswordHandler.formExceptions"
                                                      name="exceptions" />
                                                 <dsp:oparam name="output">
                                                      <font color="red">
                                                           <li><dsp:valueof param="message" /></li>
                                                      </font>
                                                 </dsp:oparam>
                                            </dsp:droplet>
                                       </ul>
                                  </dsp:oparam>
                             </dsp:droplet>



                             <table>
                                  <!-- <tfoot>
                                       <tr>
                                            <td> </td>
                                            <td><span>log in</span></td>
                                       </tr>
                                  </tfoot>-->
                                  <tbody>
                                       <tr>
                                            <td>Email:</td>
                                            <td><dsp:input type="text"
                                                      bean="ForgotPasswordHandler.value.email" maxlength="30" size="30"
                                                      required="true" name="email" id="email"/></td>
                                       </tr>

                                       <tr>
                                            <td colspan="1" align="center"><dsp:input type="submit"
                                                      bean="ForgotPasswordHandler.forgotPassword" value="Submit" /></td>
                                       </tr>
                                  </tbody>

                             </table>
                        </dsp:form>
                   </div>

                   <div id="footer"><jsp:include page="footer.jsp" /></div>
              </div>
         </body>
    </dsp:page>
    </html>
    ----------------------------------



    Here is the LOG i am getting.
    ---------------------
    18:50:08,007 INFO [TemplateEmailSender] DEBUG sendEmailMessage invoked.
    18:50:08,099 INFO [TemplateEmailSender] DEBUG registered email request EmailRequest[atg.userprofiling.email.TemplateEmailInfoImpl@65a32517(mailingId=null, messageSubject=Requested Password)] with synchronization EmailSynchronization[TransactionImple < ac, BasicAction: a0101a7:c205:517a7d67:8
    18:50:08,101 INFO  [ForgotPasswordHandler] DEBUG success - redirecting to: login.jsp
    18:50:08,203 INFO [TemplateEmailSender] DEBUG email synchronization EmailSynchronization[TransactionImple < ac, BasicAction: a0101a7:c205:517a7d67:899 status: ActionStatus.COMMITTED >] queueing email requests
    18:50:08,204 INFO [TemplateEmailSender] DEBUG queued email request EmailRequest[atg.userprofiling.email.TemplateEmailInfoImpl@65a32517(mailingId=null, messageSubject=Requested Password)] Queue size = 1
    18:50:08,207 INFO [TemplateEmailSender] DEBUG de-queued email request EmailRequest[atg.userprofiling.email.TemplateEmailInfoImpl@65a32517(mailingId=null, messageSubject=Requested Password)] Queue size = 0
    18:50:08,668 INFO [TemplateEmailSender] DEBUG created session atg.servlet.sessiontracking.GenericHttpSession@139c78b9 with id 261B3D78F2D56F68239C8DCA7191FA13 parent session id = 261B3D78F2D56F68239C8DCA7191FA13, cookieString = JSESSIONID=261B3D78F2D56F68239C8DCA7191FA13
    18:50:08,712 INFO [TemplateEmailSender] DEBUG Unable to send email to recipient: user:170000. Email status is set to invalid
    18:50:08,712 INFO [TemplateEmailSender] DEBUG doSendEmailMessage: numMessages = 1
    18:50:08,988 INFO [STDOUT] DEBUG: setDebug: JavaMail version 1.4ea
    18:50:08,995 INFO [STDOUT] DEBUG: getProvider() returning javax.mail.Provider[TRANSPORT,smtp,com.sun.mail.smtp.SMTPTransport,Sun Microsystems, Inc]
    18:50:09,048 INFO [SMTPEmail] DEBUG Attempting to open a connection...
    18:50:09,049 INFO [STDOUT] DEBUG SMTP: useEhlo true, useAuth false
    18:50:09,049 INFO [STDOUT] DEBUG SMTP: trying to connect to host "smtpcorp.com", port 2525, isSSL false
    18:50:11,102 INFO [STDOUT] 220 smtpcorp.com ESMTP Exim 4.72 Fri, 26 Apr 2013 13:20:08 +0000
    18:50:11,102 INFO [STDOUT] DEBUG SMTP: connected to host "smtpcorp.com", port: 2525
    18:50:11,122 INFO [STDOUT] EHLO ******
    18:50:11,391 INFO [STDOUT] 250-smtpcorp.com Hello *******[*********]
    250-SIZE 52428800
    250-PIPELINING
    250-AUTH CRAM-MD5 PLAIN LOGIN
    250-STARTTLS
    250 HELP
    18:50:11,391 INFO [STDOUT] DEBUG SMTP: Found extension "SIZE", arg "52428800"
    18:50:11,391 INFO [STDOUT] DEBUG SMTP: Found extension "PIPELINING", arg ""
    18:50:11,392 INFO [STDOUT] DEBUG SMTP: Found extension "AUTH", arg "CRAM-MD5 PLAIN LOGIN"
    18:50:11,392 INFO [STDOUT] DEBUG SMTP: Found extension "STARTTLS", arg ""
    18:50:11,392 INFO [STDOUT] DEBUG SMTP: Found extension "HELP", arg ""
    18:50:11,392 INFO [STDOUT] NOOP
    18:50:11,659 INFO [STDOUT] 250 OK
    18:50:11,661 INFO [STDOUT] NOOP
    18:50:11,929 INFO [STDOUT] 250 OK
    *18:50:11,932 INFO [TemplateEmailSender] DEBUG Caught exception, presumably thrown because not implemented: CONTAINER:atg.userprofiling.email.TemplateEmailException: Error setting the value of property numSkipped for mailing null; SOURCE:atg.repository.RepositoryException: Ids cannot be null*
    18:50:11,933 INFO [STDOUT] NOOP
    18:50:12,198 INFO [STDOUT] 250 OK
    18:50:12,199 INFO [STDOUT] QUIT
    18:50:12,464 INFO [STDOUT] 221 smtpcorp.com closing connection
    -----------------------------
    Can you please let me know what's that exception.

    you are asking to change emailHandlerPort to 25 ,
    here i am using SMTP2GO ,they specified in their site use the PORT 2525 or 8025 etc. only.
    That's the reason i am using 2525 or 8025.
    anyhow it is connecting to smtpcorp,
    *18:50:11,102 INFO [STDOUT] DEBUG SMTP: connected to host "smtpcorp.com", port: 2525*

    Regards,
    Satya.

    Edited by: SatyaVenkat on May 15, 2013 4:21 AM

    Edited by: SatyaVenkat on May 15, 2013 4:23 AM
  • 14. Re: How to handle forgotpasswords
    RMishra Journeyer
    Currently Being Moderated
    18:50:11,932 INFO [TemplateEmailSender] DEBUG Caught exception, presumably thrown because not implemented: CONTAINER:atg.userprofiling.email.TemplateEmailException: Error setting the value of property numSkipped for mailing null; SOURCE:atg.repository.RepositoryException: Ids cannot be null
    Now you are very close to get solution. When any time sending email get failed then emailStatus property of Profile automatically set to invalid
    Just open ACC-->People and Organization-->Users-->click to list users-->click on user to whome email id you are sending email-->change Email Status to valid [options are *Unknown* , *valid* , *invalid* ]--->save it and then try again.

    Hope you get solution.

    -RMishra

    Edited by: RMishra on Apr 26, 2013 8:03 PM
1 2 Previous Next