miércoles, 27 de abril de 2016

WCP 11gR1: Change the Password Programmatically

Recently we implemented a Custom Interface for changing the password in a WebCenter Portal 11.1.1.8 environment. Here I am sharing some of the code to achieve it (taken from WebCenter API).

Java Code Snippet:

public void setPassword(ActionEvent event) {
    String METHOD_NAME = "setPassword";
    logger.entering(CLASS_NAME, "setPassword");
    final String userName = WebCenterSecurityUtils.getUserName();
    try {
      FacesContext fCtx = FacesContext.getCurrentInstance();
      Application app = fCtx.getApplication();
      // This managed bean returns if the Change Password is allowed in WebCenter
   boolean allowPasswordChange = ((Boolean)ADFContext.getCurrent().getExpressionEvaluator().evaluate("#{o_w_wa_i_v_b_changePasswordBean.passwordChangeAllowed}")).booleanValue()
      if (!allowPasswordChange) {
        logger.fine(CLASS_NAME, "setPassword", "skipping passwd change as admin has disabled it");
        WCApplicationContext.getCurrentInstance().displayWarning(WebCenterResourceBundle.class.getCanonicalName(), "PREFERENCE_PASSWORD_DISABLED", null);
      }
      else {
        String oldPassword = getOldPassword();
        String newPassword = getNewPassword();
        if (logger.isFiner()) {
          logger.finer(CLASS_NAME, "setPassword", "Changing the password for useName = " + userName);
        }
        WebCenterSecurityUtils.setPassword(userName, oldPassword, newPassword);
        setOldPassword("");
        setNewPassword("");
        setNewPasswordConfirm("");
        if (logger.isFiner()) {
          logger.finer(CLASS_NAME, "setPassword", "After invoking method binding object for service using EL: #{bindings.setUserPassword.execute}");
        }
      }
    }
    catch (Exception ex) {
      WebCenterException wex;
      if ((ex instanceof WebCenterException)) {
        wex = (WebCenterException)ex;
      } else {
        wex = new WebCenterException("Unable to set the password");
      }
      WCApplicationContext.getCurrentInstance().displayError(wex);
    }
    finally {
      logger.exiting(CLASS_NAME, "setPassword");
    }
}

As you can see in the code above, the important 

JSFF Snippet:

<af:panelFormLayout labelWidth="200" rows="3" maxColumns="1"
     partialTriggers="save" id="pfl1">
 <af:inputText label="Old Password"
    value="#{backingBeanScope.myPasswordBean.oldPassword}"
    secret="true"
    validator="#{webcenterValidator.oldPasswordValidator}"
    required="true" id="it1"/>
 <af:spacer height="10" id="s3"/>
 <af:inputText label="New Password"
    value="#{backingBeanScope.myPasswordBean.newPassword}"
    secret="true"
    validator="#{webcenterValidator.newPasswordValidator}"
    required="true" id="it2"/>
 <af:spacer height="10" id="s4"/>
 <af:inputText label="Confirm New Password"
    value="#{backingBeanScope.myPasswordBean.newPasswordConfirm}"
    secret="true"
    validator="#{webcenterValidator.newPasswordConfirmValidator}"
   required="true" id="it3"/>
</af:panelFormLayout>
<af:commandButton id="save" partialSubmit="true"
                          text="Save"
                          actionListener="#{backingBeanScope.myPasswordBean.setPassword}"/>

Note: Remember that your LDAP has to be conigured with the rights for allowing users to change the password.

TIP: Validators where not included in this post, but it is using the defined by WebCenter ;).

lunes, 25 de abril de 2016

WCP 11gR1: Last Login of Portal Users

Hi.

Recently I was asked about how to retrieve the latest login time of a specific user in WebCenter Portal 11.1.1.8

Basically, the solution was consuming WebCenter Analytics schema which holds analytics about user login.

SELECT DISTINCT ASDIM_USERS.USERID AS "User", ASFACT_WC_LOGINS_0.OCCURRED as "last_login"
FROM ASFACT_WC_LOGINS_0 , ASDIM_USERS
WHERE ASFACT_WC_LOGINS_0.USERID = ASDIM_USERS.ID AND ASDIM_USERS.USERID = 'myuser'
ORDER BY ASFACT_WC_LOGINS_0.OCCURRED DESC

 Obviously, WebCenter Portal has to be configured with WebCenter Analytics Collector for using the above query consuming the ACTIVITIES Schema.

Thanks to Paco Roldán for collaborating on it :).

lunes, 22 de febrero de 2016

WCC: Check if Framework Folders is enabled using RIDC

Useful snippet of code for check if your WebCenter Content is using Folders_g or Framework Folders as the Foldering Service in your RIDC Code.

The clue is the use of CONFIG_INFO IDC Service.

private synchronized void checkFrameworkFoldersEnabled() throws IdcClientException {
    final String METHOD_NAME = "checkFrameworkFoldersEnabled";
    logger.entering(CLASS_NAME, METHOD_NAME);
    // Get IdcClient and IdcContext if necessary
 if (!configChecked) {
        DataBinder binder = idcClient.createBinder();
        binder.putLocal("IdcService", "CONFIG_INFO");
        DataBinder rb = idcClient.sendRequest(defaultIdcContext, binder).getResponseAsBinder();
        DataResultSet resultSet = rb.getResultSet("EnabledComponents");
        List<DataObject> components = resultSet.getRows();
        for (DataObject component : components) {
            if (("FrameworkFolders".equals(component.get("name"))) && ("Enabled".equals(component.get("status")))) {
                folderingService = "FrameworkFolders";
                break;
            }
            if (("Folders_g".equals(component.get("name"))) && ("Enabled".equals(component.get("status")))) {
                folderingService = "Folders_g";
                break;
            }
        }
        if (folderingService == null) {
            if (logger.isWarning()) {
                logger.warning(CLASS_NAME, METHOD_NAME, "Not able to determine Foldering Service on Content Server, defaulting to Folders_g");
            }
            folderingService =  "Folders_g";
        }
        configChecked = true;
    }
    if (logger.isInfo()) {
        logger.info(CLASS_NAME, METHOD_NAME, "Current RIDC Foldering Service: " + folderingService);
    }
    logger.exiting(CLASS_NAME, METHOD_NAME);
}