Fix FileMaker external authentication problems with dsmemberutil

Today I switched the group membership of one person in Open Directory to change their external authentication account and thus their FileMaker privilege set.  The change did not take effect and the user retained their existing privileges. I fixed the problem by using the command line directory service member utility.

My first advice is that you read the man page on the topic by typing into terminal man dsmemberutil and perhaps reading about FileMaker LDAP authentication as well.

The first thing I did was check group membership on the client machine by typing:

sudo dsmemberutil checkmembership -u 1234 -g 5678

You will need to replace 1234 with the user ID of the person you are testing and the 5678 with the group ID of which you are testing membership.  If the user is not a member of the group, terminal will respond with

user is not a member of the group.

If the user is a member of the group, then terminal will respond with

user is a member of the group.

Perform this check on both the client machine and the FileMaker Server machine.  If either gives information that is contrary to the current configuration of the user in Open Directory then you need to flush the directory cache.  This can be accomplished by typing

sudo dsmemberutil flushcache

You can run dsmemberutil checkmembership again to verify all is correct.  FileMaker external authentication should work correctly when all machines see proper group membership.

Unarchive Gmail and Google apps email back to your inbox.

I have a client who had been setup on google apps email service, bought an ipad, and wanted her email on it.  Simple request, however, her email client was originally setup with POP email.  The google settings for her pop account had it setup so that all messages were archived after being poped.  Basically, when you tell google to archive your messages, it removes the inbox label and your message goes on to live in “All Mail” for eternity.  There is no strait-forward way to put these messages back into the inbox which it what we needed since her email client would need to be converted to IMAP and I setup her iPad with Exchange.

With out further ado, here are the steps to accomplish this:

  1. Log into your gmail or google apps account and get to email / gmail.
  2. Click on settings located in the upper left corner located between your email address and Help.
  3. Click on Filters
  4. Click created new filter
  5. In the To field. enter the email address of this account.
  6. Click next step
  7. Check Apply the label
  8. Click on the drop down that says “Choose label”
  9. Click on new label
  10. Enter a name like unarchive and press OK.
  11. Check the box beside the text that reads “Also apply filter to ### conversations below.”
  12. Click Apply Filter
  13. On the left side find the mailbox named what you named your filter and click on it.
  14. Click Select all
  15. Click on the text that says, “Select all xxx conversations in “unarchive” . Unarchive is the name of the filter.
  16. Under the move to drop down, choose Move to Inbox.  Those messages are now in your inbox
  17. Now you need to remove all the messages from the “unarchive” filter/mailbox.
  18. Click Select all
  19. Click on the text that says, “Select all xxx conversations in “unarchive” . Unarchive is the name of the filter.
  20. Click on the button that says “Remove label “unarchive” “
  21. The label / mailbox shoud now be empty and can now be deleted.
  22. Click on settings.
  23. Click on filters
  24. Click delete
  25. Click on labels
  26. Beside the name of “unarchive” or what ever you named the label click remove
  27. A pop up box appears asking you to confirm “Delete the label “unarchive”?”
  28. Click OK
  29. You’re done!!!

I hope this is of help to someone.  Use the above with care, as I make no guarantee.  Email is pretty important to me and I imagine to you as well so be careful.

FileMaker layout order of evaluation

While working on my merge variable technique, I needed to examine the order in which FileMaker evaluates objects on a layout when a record is loaded.  My results showed that evaluation generally happens in this order:

1.  Part order (header to body to footer)

2. In each part top to bottom and left to right.

The evaluation order in each part is difficult to explain and is best served by checking out the example file merge_variable_example.fp7.  Generally though, FileMaker looks within each part for objects from the top down looking for the first object it finds looking left to right.

When you understand how FileMaker will evaluate the screen you can then alter from the way my merge variable technique was explained. Objects and variables can be in the same part.

If you have found this technique helpful or have any tips or suggestions to make it better, please leave a comment.

Download the example file merge_variable_example.fp7

Merge variables and conditional formatting instead of calculation fields

There are times when you need to display data on a layout but don’t really need or want to define a new field in your FileMaker database. With the new merge variable in FileMaker 11, you can use conditional formatting, a let statement, and a merge variable to reduce the number of fields with calculations in your tables.

This technique is very simple to implement and has one caveat.  If data is changed in the database, the variable will not change without a window refresh.

The example file merge_variable_example.fp7 shows one parent with many children. The merge variable displays a list of children.

Technique:

1.  Place an object in the header part

2.  Define conditional formatting for that object using a let statement that defines either a local or global variable. The advantage of using a local variable is that it is gone once you leave the layout.

3.  Insert the merge variable onto the layout in any part below the header.

You do have the option to place both the object being conditionally formatted and the merge variable in the same part but you must understand how filemaker evaluates and draws a record when it is loaded.  Please see my blog post here for more information.

Pros and Cons of this technique:

Pro:

  1. Less scripts and script triggers in your solution
  2. You can have “narrower” tables which improves filemaker client / server performance. If you have a layout with even just one field, the data from every field is sent to the FileMaker client.
  3. Benefit to developers using separation model.

Con:

  1. If data changes, you will not see it until a screen refresh.

If you have found this technique helpful or have any tips or suggestions to make it better, please leave a comment.

Download the example file merge_variable_example.fp7

growlnotify over network

When using growlnotify be sure that the user on the computer displaying the growl messages has privileges to run terminal.  Open Directory allows admins to prevent access to applications.  I have terminal access blocked for most of my users.  This block was preventing access to growl notify.

Here is an example of what to use with the applescript step in FileMaker to send growl notifications.

do shell script “usr/local/bin/growlnotify -m ‘message here’  -H 192.168.1.1”

The receiving computer has to have listen for incoming connections enabled under the “network” tab of the growl preference panel.

Enjoy 🙂

Drew

Hide Mac Desktop Icons

If you are like most mac users, your desktop get polluted with large numbers of icons from files that you save to your desktop and then never quite get time to “file away”. This trick with the below applescript / shellscript will cover your bad habit and make you look much more organized / professional than you are when it counts 😉

Please note you are doing the below at your own peril and I am not responsible what may or may not happen to your computer /data.  You might want to check out the man page for the command used for more information:

http://www.manpagez.com/man/1/chflags/

Step 1: Launch Script Editor

MacintoshHD/Applications/AppleScript/ScriptEditor

Step 2: Create two scripts:

1. Paste in the following:

do shell script “chflags hidden ~/Desktop/*”

2. Go to File -> Save As

3. Save the script to:

Macintosh HD/Users/youruser/Library/Scripts/Hide Desktop

4. Under Script Editor File menu select New

5. Paste in the following:

do shell script “chflags nohidden ~/Desktop/*”

6. Go to File -> Save As

7. Save the script to:

Macintosh HD/Users/youruser/Library/Scripts/Show Desktop

Step 3 – Add scripts to menu bar

1.  Launch Applescript Utility

(Macintosh HD/Applications/AppleScript/AppleScript Utility)

2.  Make sure there is a check next to “Show Script menu in menu bar”

Note that if you uncheck Show Computer scripts it will remove from view all the scripts that ship as part of OS X.  That is what I did to simplify my menu but that is your call.

Step 4 – Go to the menu bar (upper right) and click on the scroll icon.  You should now see the two scripts.  Click on them to hide or unhide the desktop.

Remove a key from a return delimited list

I needed to remove a key from a return delimited list of keys and came up with this formula.  I also went ahead and made a custom function that is in this sample file.

Let

(

[

$text = example::original ;

$key = example::key_to_remove ;

$text_length = Length ( $text ) ;

$key_length = Length ($key) ;

$key_position = Position ( $text; $key; 1; 1 )

];

Left ( $text ; $key_position – 1 ) & Right ( $text ; $text_length – $key_position – $key_length )

)

Truly Custom Dialog box with multiple records and related data in FileMaker

I was challenged with creating a pop-up dialog box containing information from multiple records and related data.  Obviously a “Show Custom Dialog” script step would not work.

Solution:

  1. Create your layout to display the data.
    1. Layout should be list view
    2. Note the height and width of the new layout for 1 record
  2. Have initial script run
  3. When the initial script needs the custom dialog which was entered with an If script step the following script steps happen.
    1. Set Variable:  Set a variable containing the width of the new layout.  This will be used for centering the new layout over the layout.
    2. New Window:
      1. Label the window.  I used a variable ( $title ) so that I could reuse it when I use the close window script step.
      2. The prompt for my situation was when there were one or more records that needed chosen.  That is when I set the variable $record_count.  I set the height of the window based on the number of related records.  This is done by multiplying the $record_count by the height of one record on the new layout.
      3. I set the distance from top to zero to allow for the most number of records to be seen.
      4. Distance from left was set using the previously set $dialog_width variable and the Get (ScreenWidth) function.  Basically I divided the width of the screen and then subtracted half the width of dialog box.  This centers the box on the screen.  I could have just typed the numbers in but decided to use the $dialog_width variable for three reasons:
        1. If I need to tweak it in the future I will only have to change the number in one place instead of two.
        2. It is easier to see in the ScriptBuilder
        3. Variables are cool 🙂
          1. So cool in-fact that I decided to set the height with one as well for consistency.
  4. picture-35

  5. I then enter a loop.  This keeps the user from doing anything else until they make a selection
  6. On the custom dialog I have two buttons.  When either selection is chosen it sets a variable to 1.  This is looked at every 1 second by using a Pause/Resume Script and specifying 1 second duration.  The Exit Loop If step looks for either variable to be set to one.
  7. Using If and Else If script steps  you can  choose what action to take based on which global variable is set to 1.  In my case, when $choice_1 is set to 1 then a script will be performed.  If $choice_2 is 1 then the new window is closed and the script is exited.
    1. I reused the window name variable ( $title) I had previously used to name the specific window to close.
    picture-37